Ở đây tôi có một con trỏ ptrtới mảng arr4 số nguyên. ptrchỉ vào toàn bộ mảng. ptr[0]hoặc *ptrtrỏ đến phần tử đầu tiên của mảng, vì vậy, thêm 1 để ptr[0]cung cấp địa chỉ của phần tử thứ hai của mảng.
Tôi không thể hiểu tại sao việc sử dụng sizeof(ptr[0])lại cho kích thước của toàn bộ mảng, 16 byte, chứ không phải kích thước của chỉ phần tử đầu tiên, 4 byte, (như ptr[0]trỏ đến phần tử đầu tiên trong mảng).
int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16
int *ptr = arr;? Thật ra, không. int (*ptr)[4]tạo ptrnhư một con trỏ tới một mảng đầy đủ gồm bốn intgiá trị. Cú pháp con trỏ như thế là cần thiết để phân bổ động các mảng đa chiều thực. "Mảng 2 chiều" được tạo ra với các malloc()vòng lặp lồng nhau và được mô tả sai là mảng đa chiều thực sự là mảng 1-d của con trỏ tới nhiều mảng 1-d. Xem stackoverflow.com/questions/42094465/ từ
int *ptr = arr;không? Điều đó sẽ làm cho nó trỏ đến điểm bắt đầu (phần tử đầu tiên của) mảng, tương đương với&arr[0].