Указатели C - чтение значений из абсолютных адресов в сравнении с оператором AddressOf (&) - PullRequest
0 голосов
/ 24 февраля 2019

Если бы я не скомпилировал код, я бы сказал, что 1 и 2 дают тот же результат, так как оба имеют указатель int p указывает на переменную age .Разыменование age в 1 и 2 должно давать одинаковый результат.Я также понимаю, что 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 голосов
/ 24 февраля 2019

Вы пытаетесь обмануть компилятор, и он выглядит умнее, чем вы ...

Более серьезно, кроме случаев, когда вы действительно знакомы с внутренностями компилятора, никогда не пытайтесь угадать, как он будет переводитьсяваш источник.Как правило, в вашем последнем примере компилятор может легко увидеть, что переменная age1 никогда не используется (по крайней мере, никогда соответствующим образом).Так что это может оптимизировать это.Если вы действительно хотите лучше понять, что здесь происходит, вам придется попросить компилятор создать язык ассемблера, который он сгенерировал внутри, и прочитать его.Вы увидите, была ли переменная оптимизирована (потому что она не сгенерирована), или она не была последовательной по отношению к другой переменной.

И в любом случае, приятно попытаться лучше понять, что делает компилятор, но, пожалуйста, никогда не делайте этого в рабочем коде.

0 голосов
/ 24 февраля 2019

Кто вы знаете, что адрес age 0x66FC9C?Если это не так, то вам не будет гарантирован одинаковый результат в 1 и 2. Эквивалентные рассуждения могут быть даны 2 и 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...