You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从汇编视角解读取址运算符、数组及相关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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:29:52