Указатель на указатель в c, получение неожиданного значения - PullRequest
0 голосов
/ 05 января 2020

Я делал некоторые операции с указателями и наткнулся на это:

int main(void)
{
    int a = 100;
    int *p, *q;
    p = &a;
    q = &p; 

    printf("\n *q= %p",*q);
    printf("\n &p= %p",&p);
    printf("\n *p= %d",*p);
    printf("\n q= %p",q);
    printf("\n p= %p",p);
    printf("\n &a= %p",&a);
    return 0;
}

Это дает мне следующий вывод

 *q= 0xe5b83d74
 &p= 0x7ffee5b83d78
 *p= 100
 q= 0x7ffee5b83d78
 p= 0x7ffee5b83d74
 &a= 0x7ffee5b83d74

Значение, данное *q, похоже на адрес a, но это не то же самое. *q не относится к &a? Я не пытаюсь исправить этот код. Что на самом деле здесь происходит?

1 Ответ

3 голосов
/ 05 января 2020

Указатель на a обрезается и печатается. Вы берете указатель на указатель на int и делаете его указателем на int. Он показывает только 32-битный указатель, то есть 32-битные, которые могут поместиться в int.

Если вы запустите это на 32-битной платформе (x86, ARM), то &a будет так же, как и *q.

В своем заголовке вы заметили, что это указатель на указатель. Однако это не так. Это указатель на указатель, который был преобразован в указатель на int и разыменован. Есть разница, как показано здесь.

...