【发布时间】:2018-09-28 03:14:44
【问题描述】:
Q1:地址运算符获取该变量的地址。例如:
int var1;
int *p;
p = &var1;
程序在第 3 行将 var1 的地址传递给变量 p。
是不是CPU创建了一个空间来放var1的地址(由于地址操作符),然后交给p?
Q2:代码如下:
int A[3]= {2, 4, 6};
int *p = A;
printf("%d\n", p);
printf("%d\n", *p);
打印 p 的值和 p 的解引用值(A[1] 的值), 相当于:
int A[3]= {2, 4, 6};
printf("%d\n", A);
printf("%d\n", *A);
Q2的第一个例子很清楚,CPU创建了另一个变量p来存储A的地址。
除了创建一个变量 p 之外,第二个示例是否在 CPU 中做同样的事情?
谢谢
【问题讨论】:
-
根据您使用的编译器(您没有指定),有一些方法可以让它输出它生成的程序集。我的期望是编译器能够对此进行大量优化。生成的程序集不一定必须为每个 C 变量指定位置。它们可能会结合在一起,或者完全优化掉。
-
很确定这有您正在寻找的所有答案:stackoverflow.com/a/4955297/2495283
-
JFYI:
*p和*A在后面的示例中指的是A[0]元素,而不是A[1],在 C 中,数组索引从零开始。当您将其视为内存地址时,这是有道理的,如果A是数组内容的第一个字节的内存地址,那么A+0仍然是第一个元素,但A+1被编译器调整为机器码@ 987654332@,即指向数组的第二个元素=开始后的一个元素。