Не правда ли, что двойной указатель хранит адрес только указателя?
Нет. Указатель любого типа может хранить адрес чего угодно. Но в идеале программист должен убедиться, что в нем хранится адрес действительного типа.
Делая ptr = &a;
, вы сохраняете адрес целого числа в переменной двойного указателя.
printf("value of a = %d\n",*ptr); //why it works?
*ptr
вернет значение по адресу, сохраненному в ptr
. Поскольку сохраненный адрес имеет целочисленную переменную, он возвращает целочисленное значение. Но обратите внимание, что возвращаемое значение будет иметь тип адреса, поскольку ptr является двойным указателем. Однако в printf()
вы используете %d
для печати значения. Таким образом, значение типа указателя, возвращаемое *ptr
, будет приведено к целому числу и напечатано Таким образом, вы получите правильный вывод.
printf("value of a = %d\n",**ptr); //why it doesnt work?
Это не работает, потому что это эквивалентно (*(*ptr))
. Итак, вы пытаетесь прочитать целочисленное значение, хранящееся по адресу 10. Я думаю, что это либо недопустимый адрес на вашем компьютере, либо ваша программа не имеет разрешения на чтение этого адреса.
PS: Вы должны получать предупреждения компилятора. Они дают некоторые подсказки.