Что означает int * * k?

Я новичок в языке программирования C. Я увидел в книге код:

#include<stdio.h>
int main(){
    int * * k, *a, b=100;

    a = &b;
    k = &a;
    printf("%d\n",* * k);
}

Я не знаю значения int * *k. Это целочисленный указатель или значение? на что это будет указывать? что он будет содержать / хранить? какая польза от этой переменной? Как мне понять это выражение?


person Bing Sun    schedule 14.02.2017    source источник
comment
Это двухуровневое разыменование указателя.   -  person haccks    schedule 14.02.2017
comment
k - указатель, указывающий на целочисленный указатель   -  person zzn    schedule 14.02.2017


Ответы (5)


int **k

k - это указатель на указатель на int (двойной указатель) и содержит адрес некоторой другой переменной-указателя.

В вашем примере:

 int  b = 100;   /* 'b' is an int, initialized to value 100 */
 int *a = &b;  /* a is a pointer-to-int*/
 int **k = &a; /* k is a pointer-to-pointer-to-int */

См. Рисунок ниже для лучшего понимания:

ptr

person msc    schedule 14.02.2017
comment
Спасибо. подскажите, в какой ситуации будет использоваться этот указатель на указатель? - person Bing Sun; 14.02.2017
comment
@BingSun Если нам нужен список слов (предложение), мы можем его использовать. - person msc; 14.02.2017
comment
@BingSun См. Вопрос о переполнении стека: stackoverflow.com/questions/5580761/ - person msc; 14.02.2017
comment
Думаю, теперь я понял. Спасибо! - person Bing Sun; 14.02.2017

int** k - указатель на указатель типа int.

Он хранит адрес памяти, в этом адресе памяти есть другой адрес памяти, в котором хранится некоторое целочисленное значение.

person Tony Tannous    schedule 14.02.2017

Это называется двойным указателем. Его можно использовать для хранения адреса из одного указателя.

Вы также можете создать тройной указатель для хранения адреса из двойного указателя.

Пример: int ***k;

person algojava    schedule 14.02.2017

Это называется указателем на указатель.

Здесь выход для ** k равен 100, значение b.

  *(*k) = *(a) = *(address of b) = value of b
person Pooja N    schedule 14.02.2017

*k

означает, что некоторый код позже получит значение с адреса k.

*(*k)

означает, что некоторый код позже получит значение с адреса (* k).

int **k

означает, что k предназначен для использования для разыменования адресов для целочисленного использования, но со вторым уровнем. Наличие этого символа * сразу после имени переменной при ее определении делает ее указателем. Итак, k - это указатель на указатель на целое число.

Чтобы получить значение ячейки, на которую указывает указатель,

*k

используется так же, как в определении. Тогда, когда это указатель второго порядка, тогда

**k

используется для получения указанного значения.

person huseyin tugrul buyukisik    schedule 14.02.2017