从汇编视角解读取址运算符、数组及相关C代码技术疑问
关于C语言指针与数组的两个问题解答
一、取址运算符&是否会为变量地址开辟新空间?
先拆解这段代码:
int var1; int *p; p = &var1;
咱们理清楚内存分配的逻辑:
- 当你定义
int var1;时,编译器已经为var1在内存中分配了一块固定的存储空间,这个空间的地址在程序运行时就确定了。 - 取址运算符
&的作用不是开辟新空间来存储这个地址,它只是把var1已经存在的内存地址值读取出来,再赋值给指针变量p。 - 指针变量
p本身的内存空间是在你定义int *p;时就分配好的(用来存储地址值,比如32位系统占4字节,64位占8字节),这和&var1的操作完全无关。
简单总结:&var1只是读取一个已有的地址值,没有新空间被开辟,只是把这个值放到p已经存在的存储空间里。
二、补全第二段代码并说明功能一致性
第一段代码:
int A[3]= {2, 4, 6}; int *p = A; printf("%d\n", p); printf("%d\n", *p);
要让第二段代码和它功能完全一致,补全后应该是:
int A[3]= {2, 4, 6}; printf("%d\n", A); printf("%d\n", *A);
为什么两者功能等价?
- 在C语言中,数组名
A在大多数表达式场景下(比如赋值给指针、作为函数参数、用于printf输出)会自动退化为指向数组第一个元素的指针。所以A和p = A里的p完全等价,都指向数组第一个元素的地址。 - 第一个
printf打印的是数组第一个元素的内存地址(p和A的值都是这个地址);第二个printf打印的是数组第一个元素的内容(*p和*A都是取指针指向的第一个元素的值,也就是2)。
内容的提问来源于stack exchange,提问作者Andy Lin
相关产品推荐
相关产品推荐

