Ở đây tôi có một con trỏ ptr
tới mảng arr
4 số nguyên. ptr
chỉ vào toàn bộ mảng. ptr[0]
hoặc *ptr
trỏ đế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 ptr
như một con trỏ tới một mảng đầy đủ gồm bốn int
giá 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]
.