Cái này nói thật là hơi khó giải thích ._.
Nó ko trỏ vào phần tử đầu tiên của mảng b.
Mà nó trỏ vào địa chỉ của “biến” mảng b.
Ta biến, 1 b iến thì có 2 phần, địa chỉ và giá trị
int a = 1;
-> &a = lấy địa chỉ
-> a = lấy giá trị
Thì mảng là đc xem 1 biến con trỏ. (Thực chất ko phải là con trỏ)
Mảng đặc biệt hơn con trỏ ở chỗ là địa chỉ nó trỏ tới = địa chỉ ô nhớ của nó đang nằm luôn.
tức nếu
int a[30];
thì &a = &a[0] = a; (*)
và *a = a[0]
(*): Điều này ko xảy ra khi bạn cấp phát động.
Ta có 1 con trỏ int (*p)[30] = &a;
tức p đang đang lưu trữ giá trị là địa chỉ của biến a.
-> p = &a
*p = &(a[0])
*(*p) = a[0]
Và lưu ý, nhìn mớ trên thì có vẻ char(*p)[] khá giống pointer to pointer. Nhưng thực chất thì nó ko phải đâu nhé.
array != pointer and pointer != array;