w C i C++ języki wartości typu array T [N]
są niejawnie konwertowane do wartości wskaźnika typu T *
w większości kontekstów (z nielicznymi wyjątkami). Wynikowy wskaźnik wskazuje na pierwszy element oryginalnej tablicy (indeks 0). Zjawisko to jest nieoficjalnie znane jako rozpad tablicowy .
printf
Argument ten jest jednym z tych przypadków, kiedy następuje zanikanie tablic .
Tablica 2D typu int [5][5]
to nic innego jak "tablica 1D z tablic 1D", tj. Jest to tablica 5 elementów, z których każdy sam jest tablicą 5int
s.
Powyższa reguła rozpadu typu tablicowego w naturalny sposób dotyczy tej sytuacji.
Wyrażenie a
, które pierwotnie ma typ tablicy int [5][5]
, rozpada się na wskaźnik typu int (*)[5]
. Wskaźnik wskazuje na element a[0]
, który jest początkiem tablicy podrzędnej a[0]
w pamięci. To jest pierwszy wskaźnik, który drukujesz.
Wyrażenie *a
jest operatorem dereferencyjnym zastosowanym do sub-wypowiedzi a
. Sub-expression a
w tym kontekście zachowuje się dokładnie w taki sam sposób jak poprzednio: rozpada się na wskaźnik typu int (*)[5]
, który wskazuje na a[0]
. W związku z tym sam wynik jest następujący: *a
. Ale a[0]
jest także tablicą. Jest to tablica typu int[5]
.Jest również zależny od rozpadu typu tablicowego. Rozpada się na wskaźnik typu int *
, który wskazuje na pierwszy element a[0]
, tj. Na a[0][0]
. To jest drugi wskaźnik, który drukujesz.
Powód, dla którego obie wartości wskaźników są takie same, jest taki sam, jak początek podzbioru a[0]
odpowiada tej samej lokalizacji pamięci, co element a[0][0]
.
C lub C++? Różne rzeczy – yizzlez
Tak się składa, ponieważ adres 'a' i wartość zawarta w' * a' są takie same. –