Vâng, chúng là những thứ khác nhau. arr
phân rã trong hầu hết các ngữ cảnh đối với một con trỏ đến phần tử đầu tiên trong mảng của bạn - điều đó có nghĩa là một con trỏ đến hàng 3 phần tử đầu tiên trong mảng 2D của bạn: loại int (*)[3]
. arr + 1
, sau đó, trỏ tới hàng thứ hai trong mảng.
&arr
là địa chỉ của chính mảng đó (loại int (*)[3][3]
), vì vậy &arr + 1
chỉ vào bộ nhớ vừa qua cuối toàn bộ mảng 2D của bạn.
Bạn có thể xác nhận hành vi này dễ dàng bằng cách in khác nhau. Cụ thể, in offset cho các con trỏ mới hơn là các giá trị tự nó sẽ giúp mọi thứ rõ ràng. Kết quả của chương trình của bạn từ các báo cáo in:
printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr);
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr);
Sẽ là offsets thập phân để &arr+1
và arr+1
tương ứng. Dưới đây là kết quả từ một chạy thử tôi chỉ cần thực hiện:
36
12
36 trận đấu lên: 3 hàng x 3 cột × 4 byte cho mỗi entry = 36 byte. Vì vậy, hàng 12: 1 × 3 cột × 4 byte cho mỗi mục = 12 byte.
Lưu ý - bạn cũng đang in con trỏ bằng cách sử dụng %d
, điều này là sai. Có thể bạn đang sử dụng %p
cho điều đó.
Nguồn
2012-08-08 04:37:53
tôi đã học được rất nhiều từ câu trả lời của bạn. Cảm ơn. –
Với '% p', bạn cần truyền các con trỏ tới' void * '. –