poniedziałek, 6 lutego 2017

C - Wskaźniki - Jednowymiarowe tablice wskaźników

Ten bardzo krótki post chciałbym poświęcić na przedstawienie przykładu deklaracji tablicy wskaźników.

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.



  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. int main(void)
  5. {
  6.     int *tablica[20];
  7.     char *tablica2[20];
  8.     int i=0;
  9.     for(i=0; i<20; i++)
  10.     {
  11.         *(tablica+i) = (int*)malloc(sizeof(int));
  12.         **(tablica+i) = i;
  13.     }
  14.     for(i=0; i<20; i++)
  15.     {
  16.         *(tablica2+i) = (char*)malloc(sizeof(char));
  17.         **(tablica2+i) = 'a';
  18.     }
  19.     for(i=0; i<20;i++)
  20.     {
  21.         printf("Element: %d Adres: %d Wartosc: %d \n", i, *(tablica+i), **(tablica+i));
  22.     }
  23.     for(i=0; i<20;i++)
  24.     {
  25.         printf("Element: %d Adres: %d Wartosc: %c %d \n", i, *(tablica2+i), **(tablica2+i), **(tablica2+i));
  26.     }
  27.     for(i=0; i<20; i++)
  28.     {
  29.         free(*(tablica+i));
  30.         free(*(tablica2+i));
  31.     }
  32.     return 0;
  33. }

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.