&地址运算符是否必要?数组指针两种赋值运行结果一致的疑问
数组名与地址运算符&的疑问解答
你的代码
#include<stdio.h> int main() { int a[5]={5,10,15,20,25}; int *p; int i; p=a; for (i=0;i<=5;i++) { printf("the address of the %d is = %d\n",*p,p); p++; } return 0; }
为什么p=a和p=&a结果一致?
这是C语言数组与指针的特性导致的:
- 数组名的隐式转换:在多数表达式场景下,数组名
a会自动转换成指向数组第一个元素的指针,等价于&a[0],类型为int *,地址值就是数组首元素的内存地址。 &a的本质:&a是取整个数组的地址,类型为int (*)[5](指向包含5个int的数组的指针),但这个地址的数值和数组首元素的地址完全相同——数组的起始位置就是首元素的起始位置。- 指针类型隐式转换:当把
&a赋值给int *类型的p时,编译器会自动进行类型转换,将数组地址的数值赋值给p,最终p存储的地址值和p=a时完全一致,后续的指针操作自然会得到相同结果。
&地址运算符是否必须使用?
- 对于
int *类型的指针,完全不需要用&,p=a是标准且规范的写法,因为数组名已经自动转换为首元素指针,完全满足赋值需求。 p=&a属于不规范写法,因为int (*)[5]和int *是不同的指针类型,虽然多数编译器能通过,但可能抛出类型不匹配的警告,且逻辑上不符合指针的类型语义,不建议使用。
额外注意
你的代码中循环条件i<=5存在问题:数组a只有5个元素,索引范围是0到4。当i=5时,p已经指向数组之外的内存区域,此时访问*p属于未定义行为,可能输出随机值甚至导致程序崩溃,建议改成i<5。
内容的提问来源于stack exchange,提问作者khushal dak
相关产品推荐
相关产品推荐

