C语言中的数组和指针有什么区别?怎么转换?

穿越時空
发布: 2025-06-25 11:39:02
原创
641人浏览过

数组和指针本质不同,但可互相转换;数组是固定大小的连续内存,不能修改地址,而指针是变量,可随时改变指向。1. 数组名是常量地址,不可赋值;2. 指针保存内存地址,可修改其指向;3. 数组在多数表达式中会退化为指针;4. 传数组给函数时形参自动转为指针;5. 指针无法还原数组长度,需手动记录信息;6. 字符串字面量用指针指向只读内存;7. 注意数组指针与指针数组的区别。理解这些异同有助于写出更清晰安全的c代码。

C语言中的数组和指针有什么区别?怎么转换?

在C语言中,数组和指针看起来很像,但它们其实是两个不同的概念。简单来说,数组是存储一组相同类型数据的连续内存空间,而指针是一个变量,它保存的是某个内存地址。虽然它们本质不同,但在很多使用场景下可以互相转换和操作。


数组和指针的本质区别

数组是一块固定大小的内存区域,编译器会记住它的长度和起始位置。例如:

int arr[5] = {1, 2, 3, 4, 5};
登录后复制

这个arr不是变量,而是常量地址,不能被赋值,比如你不能写arr = NULL;。

立即学习C语言免费学习笔记(深入)”;

而指针是一个变量,它保存的是一个地址:

int *p = arr;
登录后复制

这时候p可以随意改变指向,比如你可以写p++;或者p = NULL;,这不会影响原来的数组。

所以总结一下:

  • 数组名不是一个变量,不能修改
  • 指针是一个变量,可以随时改变它的值(也就是指向)

数组怎么转成指针?

数组在大多数表达式中都会“退化”成指针,也就是说,除了作为sizeof或&运算的操作数外,数组名会自动变成指向其第一个元素的指针。

比如:

int arr[5];
int *p = arr; // 这里arr就退化成了int*
登录后复制

也可以用取地址的方式获取指针:

int *p = &arr[0]; // 和上面等价
登录后复制

还有一种情况是把数组传给函数时,形参会被编译器自动处理为指针:

void func(int arr[]) {
    // 实际上arr会被当作int*
}
登录后复制

指针能还原成数组吗?

严格来说,指针本身并不知道它指向的内存有多大,所以在运行时无法从指针直接还原出数组的长度。除非你自己记录了相关信息。

举个例子:

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;

// 你只能通过p访问元素,但不知道它后面有几个元素
for (int i = 0; i < 5; i++) {
    printf("%d\n", p[i]);
}
登录后复制

这里必须你知道数组长度是5,否则无法安全地遍历整个数组。

所以结论是:

  • 从指针到数组的转换更多是逻辑上的理解,而不是语法层面的转换
  • 需要你自己保留数组长度信息才能安全使用指针访问数组内容

使用时容易混淆的地方

有时候你会看到类似这样的写法:

char *str = "hello";
登录后复制

这是字符串字面量,虽然用的是指针,但它指向的是只读内存中的字符数组。这种情况下,你不应该试图修改内容,比如str[0] = 'H';会导致未定义行为。

还有数组指针和指针数组的区别也容易搞混:

int (*p1)[5];  // p1是指向有5个int的数组的指针
int *p2[5];    // p2是5个指向int的指针组成的数组
登录后复制

这两个写法差别挺大,注意括号的位置。


基本上就这些。数组和指针关系密切,但又不完全一样。理解它们之间的异同和转换方式,有助于写出更清晰、安全的C代码。

以上就是C语言中的数组和指针有什么区别?怎么转换?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号