C指针-从绝对地址中读取值与AddressOf运算符(&)

时间:2019-02-24 12:13:44

标签: c pointers memory

如果我不编译代码,我会说 1 2 会得到相同的结果,因为它们都具有 int 指向变量 age 的指针 p 。在 1 2 中取消引用 age 应该会得到相同的结果。我也知道 3 只会给我变量 age 的第一个字节,因为它的类型为 char 。我无法解释为什么 1 2 给出不同的结果,以及为什么 2 3 给出相同的结果。

1

int age = 20;
int* p = (int *)0x66FC9C;
printf("You're : %d\n", *p );

2

int age = 20;
int *p = &age;
printf("You're : %d\n", *p );

3

int age = 20;
char* p = (char *)0x66FC9C;
printf("You're %d\n", *p );

跟进

这很奇怪,因为当我这样做时:

int age1 = 20;
int age2 = 19;
int* p = &age2;
printf("You're %d  %d  %d  %d\n", *p, *(p+1), &age1, &age2 );

enter image description here

实际上我打印地址,我总是总是正确地 p + 1 (这意味着我可以预测地址),但是如果我这样做:

int age1 = 20;
int age2 = 19;
int* p = &age2;
printf("You're %d  %d\n", *p, *(p+1)  );

enter image description here

我永远猜不到。就像C知道正在监视... 咳嗽咳嗽双缝实验

2 个答案:

答案 0 :(得分:1)

您正试图欺骗编译器,它看起来比您更聪明...

更严重的是,除非您真的了解编译器的内部知识,否则请不要尝试猜测它将如何转换您的源代码。通常,在您的最后一个示例中,编译器可以很容易地看到从未使用过age1变量(至少从未以一致的方式使用过)。因此可以对其进行优化。如果您确实想更好地了解此处发生的情况,则必须要求编译器产生其内部生成的汇编语言,然后进行阅读。您将看到一个变量是否已被优化(因为未生成),或者是否与另一个变量不连续。

无论如何,最好能更好地理解编译器的功能,但请从不在生产代码中这样做。

答案 1 :(得分:0)

您谁知道age的地址是0x66FC9C?如果不是,那么您将无法保证在1和2中得到相同的结果。可以对2和3进行等效推理。