Tablica wskaźników — struktura, w której każdy element jest wskaźnikiem, zazwyczaj tego samego typu. Używana np. do przechowywania listy ciągów znaków (char *arr[];).
Wskaźnik na tablicę — zmienna, która przechowuje adres początku całej tablicy (np. int (*ptr)[10]; wskazuje na tablicę z 10 elementami typu int).
Przykłady:
// Tablica wskaźników na char (tablica ciągów znaków) char *days[] = {"Sun", "Mon", "Tue"}; // Wskaźnik na tablicę z 10 liczb całkowitych int arr[10]; int (*p)[10] = &arr; // Odwołanie: printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]
"Czym różni się
char *arr[3];odchar (*arr)[3];i jak poprawnie odnosić się do ciągów w każdym przypadku?"
Wielu uważa, że nie ma żadnej różnicy lub że to po prostu synonimy.
Poprawna odpowiedź:
char *arr[3]; — tablica 3 wskaźników na char (zazwyczaj tablica ciągów znaków).char (*arr)[3]; — wskaźnik na tablicę 3 char (wskaźnik na jednowymiarowy ciąg o długości 3).char *arr1[3] = {"a", "bb", "ccc"}; printf("%s", arr1[1]); // bb char str[3] = {'x', 'y', 'z'}; char (*arr2)[3] = &str; printf("%c ", (*arr2)[2]); // z
Historia 1
W projekcie utworzono tablicę ciągów do menu, ale napisano char menu[5][30]; Niedokładnie przekazano ją do funkcji jako char *menu, przez co funkcje działały tylko z pierwszym ciągiem, a pozostałe były zniekształcone lub program się zawieszał.
Historia 2
Próbowano stworzyć tablicę wskaźników na tablice: int *arr[10]; zainicjowano przez pętle, ale tak naprawdę przechowywano wskaźniki do lokalnych tablic, co spowodowało UB przy odwołaniach.
Historia 3
W realizacji kolejki FIFO dla buforów pomieszano, gdzie brać adres całej kolejki (wskaźnik na tablicę) a gdzie brać element (tablica wskaźników na bloki). Z tego powodu przesunięcia wskaźników były niepoprawne — dane zostały utracone.