Podwójny wskaźnik jest czasem stosowany, by zmienić wartość samego wskaźnika. Przykład:
int x = 5;
int y = 10;
void changeToX(int **ptr)
{
*ptr = &x;
}
void changeToY(int **ptr)
{
*ptr = &y;
}
int main()
{
int *x_ptr = &x;
int *y_ptr = &y;
changeToX(&y_ptr);
changeToY(&x_ptr);
}
Dzięki changeToX oraz changeToY możesz zmienić wartość samego wskaźnika - możesz zmienić go tak, żeby wskazywał na coś innego. Po wykonaniu tych funkcji x_ptr będzie wskazywał na y a y_ptr będzie wskazywał na x.
Drugi zapis natomiast tworzy nowy wskaźnik i kopiuje wartość z "hight". Tworzysz dzięki temu kopię wskaźnika "hight", wszelkie. Podwójny wskaźnik to po prostu wskaźnik, który wskazuje na wskaźnik do czegoś.
Zwykły wskaźnik wskazuje na jakiś adres w pamięci a wskaźnik na wskaźnik wskazuje na sam ten wskaźnik.
Trochę to brzmi dziwnie ale w praktyce jest łatwe.
int data;
int *dataPtr = &data;
int **dataPtrPtr = &dataPtr;
int *otherPtr = &dataPtrPat; //error
A takie coś nie działa, bo typ się nie zgadza. Gdyby coś takiego działało oznaczałoby to, że int == int** (bo do int* zapisujesz adres inta a nie int**) co jest błędem. int != int** bo prawa strona to wskaźnik. Wskaźnik nie zawsze ma 4 bajty tak jak int - właściwie na 64 bitowych systemach ma on 64 bity i zapisywanie wskaźnika do inta jest błędem.