Jeśli wyrażenie type name[count]
jest zapisane w jakiejś funkcji, to powiesz kompilatorowi C, aby przydzielił sizeof(type)*count
bajty ramki stosu i obliczył adres pierwszego elementu w tablicy.
Jeśli wyrażenie type name[count]
jest zapisane poza wszystkimi definicjami funkcji i struktur, należy poinformować kompilator C, aby przydzielił sizeof(type)*count
bajty segmentu danych i obliczył adres pierwszego elementu w tablicy.
name
w rzeczywistości jest stałym obiektem, który przechowuje adres pierwszego elementu w tablicy, a każdy obiekt, który przechowuje adres pewnej pamięci, jest nazywany wskaźnikiem, dlatego jest to powód, dla którego traktujesz go name
jako wskaźnik, a nie tablicę. Należy pamiętać, że do tablic w C można uzyskać dostęp tylko poprzez wskaźniki.
Jeśli count
jest stałym wyrażeniem, którego wynikiem jest zero, to powiesz kompilatorowi C, aby przydzielił zero bajtów albo ramce stosu, albo segmentowi danych i zwrócił adres pierwszego elementu w tablicy, ale problem polega na tym, że pierwszy element tablicy zerowej długości nie istnieje i nie można obliczyć adresu czegoś, co nie istnieje.
Jest to racjonalne, że element nr. count+1
nie istnieje w count
tablicy -długości, dlatego kompilator C zabrania definiowania tablicy o zerowej długości jako zmiennej wewnątrz i na zewnątrz funkcji, ponieważ jaka jest wówczas jej zawartość name
? Jaki name
dokładnie adres przechowuje?
Jeśli p
jest wskaźnikiem, to wyrażenie p[n]
jest równoważne z*(p + n)
Tam, gdzie gwiazdka * w odpowiednim wyrażeniu oznacza dereferencję operacji wskaźnika, co oznacza dostęp do pamięci wskazanej przez p + n
lub dostęp do pamięci, w której adres jest zapisany p + n
, gdzie p + n
wyrażenie wyrażenia, bierze adres p
i dodaje do tego adresu liczbę n
pomnożoną przez rozmiar typu wskaźnika p
.
Czy można dodać adres i numer?
Tak, jest to możliwe, ponieważ adres jest liczbą całkowitą bez znaku powszechnie reprezentowaną w notacji szesnastkowej.