Poniższy przykład wykona dwie tablice wskaźników typu int, do każdego z tych elementów zostanie alokowana pamięć z zastosowanie adresowania pośredniego drugiego poziomu.
- #include <stdio.h>
- #include <stdint.h>
- #include <stdlib.h>
- int main(void)
- {
- int *tablica[20];
- char *tablica2[20];
- int i=0;
- for(i=0; i<20; i++)
- {
- *(tablica+i) = (int*)malloc(sizeof(int));
- **(tablica+i) = i;
- }
- for(i=0; i<20; i++)
- {
- *(tablica2+i) = (char*)malloc(sizeof(char));
- **(tablica2+i) = 'a';
- }
- for(i=0; i<20;i++)
- {
- printf("Element: %d Adres: %d Wartosc: %d \n", i, *(tablica+i), **(tablica+i));
- }
- for(i=0; i<20;i++)
- {
- printf("Element: %d Adres: %d Wartosc: %c %d \n", i, *(tablica2+i), **(tablica2+i), **(tablica2+i));
- }
- for(i=0; i<20; i++)
- {
- free(*(tablica+i));
- free(*(tablica2+i));
- }
- return 0;
- }
Widok działania programu:
Element: 0 Adres: 145268744 Wartosc: 0 Element: 1 Adres: 145268760 Wartosc: 1 Element: 2 Adres: 145268776 Wartosc: 2 Element: 3 Adres: 145268792 Wartosc: 3 Element: 4 Adres: 145268808 Wartosc: 4 Element: 5 Adres: 145268824 Wartosc: 5 Element: 6 Adres: 145268840 Wartosc: 6
...
...
Element: 0 Adres: 145269064 Wartosc: a 97 Element: 1 Adres: 145269080 Wartosc: a 97 Element: 2 Adres: 145269096 Wartosc: a 97 Element: 3 Adres: 145269112 Wartosc: a 97 Element: 4 Adres: 145269128 Wartosc: a 97
(tablica + i) przechowuje adres kolejnych elemenów. Aby wprowadzić zmiany w jej zawartości należy zmodyfikować pole *(tablica + i), która będzie zawierać zawartość pamięci pod danym adresem. Na samym początku w pętli for pamięć zostaje za alokowana dla podanego adresu. Wyłuskanie podwójne powoduje odnalezienie adresu przypisanej pamięci do której zostaje wprowadzona zmienna. Taki samym wyłuskaniem można odnaleźć wartość jaka się w tym polu znajduje.
Wyrażenia tablica[i] oraz (tablica+1) powoduje taki sam zwrot adresu pamięci.