Как указатель на указатели работает в C? - PullRequest
160 голосов
/ 22 мая 2009

Как работают указатели на указатели в C? Когда бы вы их использовали?

Ответы [ 14 ]

3 голосов
/ 22 мая 2009

Указатель на указатель - это, в общем, указатель на указатель.

Значительным примером someType ** является двумерный массив: у вас есть один массив, заполненный указателями на другие массивы, поэтому, когда вы пишете

dpointer [5] [6]

Вы получаете доступ к массиву, который содержит указатели на другие массивы в его 5-й позиции, получаете указатель (пусть fpointer его имя) и затем получаете доступ к 6-му элементу массива, на который ссылается этот массив (так, fpointer [6]).

1 голос
/ 22 февраля 2018

Я создал 5-минутное видео, которое объясняет, как работают указатели:

https://www.youtube.com/watch?v=3X-ray3tDjQ

pointer buckets

1 голос
/ 10 июня 2015

Как это работает: Это переменная, которая может хранить другой указатель.

Когда бы вы их использовали: Многие используют один из них, если ваша функция хочет создать массив и вернуть его вызывающему.

//returns the array of roll nos {11, 12} through paramater
// return value is total number of  students
int fun( int **i )
{
    int *j;
    *i = (int*)malloc ( 2*sizeof(int) );
    **i = 11;  // e.g., newly allocated memory 0x2000 store 11
    j = *i;
    j++;
    *j = 12; ;  // e.g., newly allocated memory 0x2004 store 12

    return 2;
}

int main()
{
    int *i;
    int n = fun( &i ); // hey I don't know how many students are in your class please send all of their roll numbers.
    for ( int j=0; j<n; j++ )
        printf( "roll no = %d \n", i[j] );

    return 0;
}
0 голосов
/ 12 февраля 2018

Там очень много полезных объяснений, но я не нашел только краткое описание, поэтому ..

В основном указатель является адресом переменной. Краткий сводный код:

     int a, *p_a;//declaration of normal variable and int pointer variable
     a = 56;     //simply assign value
     p_a = &a;   //save address of "a" to pointer variable
     *p_a = 15;  //override the value of the variable

//print 0xfoo and 15 
//- first is address, 2nd is value stored at this address (that is called dereference)
     printf("pointer p_a is having value %d and targeting at variable value %d", p_a, *p_a); 

Также полезную информацию можно найти в теме Что означает ссылку и разыменование

И я не совсем уверен, когда могут быть полезны указатели, но обычно их необходимо использовать, когда вы выполняете какое-то ручное / динамическое выделение памяти - malloc, calloc и т. Д.

Так что я надеюсь, что это также поможет прояснить проблему:)

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