Язык C: Когда вы разыменовываете «указатель на указатель на int», что предполагается возвращать? - PullRequest
0 голосов
/ 18 октября 2011

Допустим, у вас есть:

    void *a = //some address;
    *((int **)(char*)a) = 5

Мне не совсем понятно, что должна делать вторая строка ... Я знаю, что "a" приводится к указателю на символ, а затем в конечном итоге приводит к указателю на указатель на int , но было неясно, что делает разыменование указателя на указатель на int на самом деле ...

Это было бы очень полезно. Спасибо

Ответы [ 3 ]

7 голосов
/ 18 октября 2011

он хранит значение 5 в «некотором адресе», но точнее, он хранит значение 5, увеличенное до размера машинного адреса в тех многочисленных байтах, начиная с «некоторого адреса».

е. г. если это 64-битный компьютер, он хранит значение 0x0000000000000005 в 8 байтах, начиная с «некоторого адреса»

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

1 голос
/ 18 октября 2011

Если вы разыменуете указатель на указатель на int, вы получите указатель на int.Разыменование означает, что вы получите объект, на который он указывает, который в данном случае является указателем на int.

Вот интересная статья, которая объясняет , как интерпретировать более сложные объявления

0 голосов
/ 18 октября 2011

Это бессмысленный, запутанный способ написания:

void* a = (void*)5;

Как мы можем сказать, оригинальный код не имеет никакого смысла.Вот что он делает:

  • Назначьте адрес для.
  • Введите тип a от пустого указателя до указателя на символ.
  • Дико введите тип указателя на указатель на указатель-to-pointer to int.
  • Возьмите содержимое указателя на указатель, то есть адрес, где должен храниться int.
  • Этот адрес будет храниться там, где в данный момент хранится его.адрес, перезаписывая его адресом 5.

РЕДАКТИРОВАТЬ: Кстати, обратите внимание, что неявное целочисленное приведение к указателю не разрешено в C (C99 6.5.4 §3).Там должно быть приведение, как в коде выше.

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