Czy są identyczne wskaźniki a, & a, * a, a [0] i a [0] oraz i [0] [0]?
Mam następujący program C:
#include <stdio.h>
int main(){
int a[2][2] = {1, 2, 3, 4};
printf("a:%p, &a:%p, *a:%p \n", a, &a, *a);
printf("a[0]:%p, &a[0]:%p \n", a[0], &a[0]);
printf("&a[0][0]:%p \n", &a[0][0]);
return 0;
}
Daje następujące dane wyjściowe:
a:0028FEAC, &a:0028FEAC, *a:0028FEAC
a[0]:0028FEAC, &a[0]:0028FEAC
&a[0][0]:0028FEAC
Nie jestem w stanie zrozumieć, dlaczego tak jest&a
, a
, *a
- wszystkie identyczne. To samo dlaa[0]
, &a[0]
i&a[0][0]
.
EDYTOWAĆ:
Dzięki odpowiedziom zrozumiałem powód, dla którego wartości te są równe. Ta linia z książki wedługKernighan i Ritchie okazał się kluczem do mojego pytania:
the name of an array is a synonym for the location of the initial element.
Tak więc dostajemy
a
= &a[0]
, i
a[0]
= &a[0][0]
(wobeca
jako tablica tablic)
Intuicyjnie, teraz powód jest jasny za wyjściem. Ale biorąc pod uwagę, jak wskaźniki są implementowane w C, nie rozumiem jaka
i&a
są równe. Zakładam, że istnieje zmiennaa
w pamięci, która wskazuje na tablicę (a adresem początkowym tego bloku pamięci-tablicy byłaby wartość tej zmienneja
).
Ale kiedy to robimy&a
, nie znaczy to, że bierze adres lokalizacji pamięci, w której zmiennaa
został zapisany? Dlaczego więc te wartości są równe?