programowanieProgramista embedded

Co to jest tablica wskaźników w języku C i czym różni się od wskaźnika do tablicy? Jak poprawnie zadeklarować i używać tych dwóch typów?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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]

Pytanie z pułapką

"Czym różni się char *arr[3]; od char (*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

Przykłady rzeczywistych błędów z powodu niewiedzy o szczegółach tematu


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.