找回密码
 立即注册
首页 业界区 业界 tips图解数组名与指针的关系

tips图解数组名与指针的关系

劝匠注 2025-9-20 14:27:31
在图解前需要先了解一下数组退化为指针的相关内容,下面先陈述数组退化为指针的概念、本质、以及什么情况下数组会退化为指针,什么情况下不会
概念定义

"数组名退化为指针"是C/C++语言中的一个重要特性,指的是数组名在大多数表达式中会自动转换为指向数组首元素的指针。这种转换由编译器自动完成,是一种隐式行为,使得对数组的操作更加灵活方便。
退化的本质


  • 数组名本身代表一块连续的内存空间,用于存储数据
  • 退化发生后,数组名失去其"数组"的身份特征,转变为指向数组首元素的右值指针(类似于const T*类型)
  • 退化后的指针值等于数组首元素的地址(即&arr[0])
发生退化的场景

1. 赋值给指针变量
  1. int arr[5] = {1, 2, 3, 4, 5};
  2. int* p = arr;// 等价于 int* p = &arr[0]
复制代码
2. 作为函数参数传递
  1. // 函数参数中的数组声明实际上等价于指针声明
  2. void func(int param[]) {
  3.                 // 等价于 void func(int* param)
  4.                 // 此处的param是一个指针,而不是数组
  5. }
  6. int main() {
  7.     int arr[5];
  8.     func(arr);// arr在这里退化为指针进行传递
  9. }
复制代码
3. 参与算术运算
  1. arr + 1;// 等价于 &arr[1],指向数组的第二个元素
复制代码
4. 用于比较运算
  1. if (arr == &arr[0]) {// 比较结果为true
  2. // 执行相应操作
  3. }
复制代码
退化的例外场景(数组名不退化)

1. 作为sizeof运算符的操作数
  1. int arr[5];
  2. printf("%zu", sizeof(arr));// 输出整个数组的大小(例如20,假设int类型占4字节)
复制代码
2. 作为&(取地址符)的操作数
  1. int arr[5];
  2. int (*p_arr)[5] = &arr;// &arr是指向整个数组的指针,类型为int (*)[5]
  3. // 注意:&arr的值与arr的值相同,但两者的含义完全不同
  4. // arr + 1跳过一个元素的大小,而&arr + 1跳过整个数组的大小
复制代码
3. 用于初始化字符数组的字符串字面量
  1. char str[] = "hello";// str代表整个数组,sizeof(str)结果为6(包含终止符'\0')
复制代码
图解一维数组(退化情况下)

1.png

一维到二维(退化情况下)

2.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

半小时前

举报

喜欢鼓捣这些软件,现在用得少,谢谢分享!
您需要登录后才可以回帖 登录 | 立即注册