C语言中&arr与arr的指针疑问及代码合法性咨询
数组arr与&arr的疑问解答
先看对应的代码:
#include <stdio.h> int main() { int *a, *b,*c,**d; int arr[10]={0}; a=arr; b=&arr;//is this true?why? c=&arr[0]; d=&a; printf("%p,%p,%p,%p",a,b,c,d); return 0; }
1. &arr是否指向数组的首地址?
是的,&arr的数值和数组首元素的地址(arr、&arr[0]的数值)完全一致,都指向数组在内存中的起始位置。但要注意,它的类型不是int*,而是int (*)[10]——也就是指向包含10个int元素的数组的指针。
2. 语句b=&arr;是否合法?
不合法。b的类型是int*(指向单个int的指针),而&arr的类型是int (*)[10](指向长度为10的int数组的指针),两者类型不兼容,C语言不允许直接赋值,编译时会抛出类型不匹配的警告或错误。如果非要让赋值合法,得加强制类型转换:b = (int*)&arr;,但这种写法不推荐,容易混淆逻辑。
3. arr与&arr之间的区别
- 类型差异:
arr在绝大多数表达式里会被自动转换成指向数组首元素的指针,类型为int*。&arr是取整个数组的地址,类型为int (*)[10](指向10个int元素组成的数组的指针)。
- 指针运算行为不同:
- 对
arr执行+1,指针会移动一个int的字节数(通常是4字节),指向数组的下一个元素arr[1]。 - 对
&arr执行+1,指针会移动整个数组的字节数(10*4=40字节),直接跳到当前数组之后的内存位置。
- 对
- 语义不同:
arr代表的是数组首元素的地址,聚焦于单个元素。&arr代表的是整个数组的地址,聚焦于整个数组作为一个连续内存块的整体。
内容的提问来源于stack exchange,提问作者zhm
相关产品推荐
相关产品推荐

