Hãy xem xét ví dụ sau:
#include<stdio.h>
int main()
{
int myArray[10][10][10][10]; //A 4 Dimentional array;
//THESE WILL ALL PRINT THE SAME VALUE
printf("%d, %d, %d, %d, %d\n",
myArray,
myArray[0],
myArray[0][0],
myArray[0][0][0],
&myArray[0][0][0][0]
);
//NOW SEE WHAT VALUES YOU GET AFTER ADDING 1 TO EACH OF THESE POINTERS
printf("%d, %d, %d, %d, %d\n",
myArray+1,
myArray[0]+1,
myArray[0][0]+1,
myArray[0][0][0]+1,
&myArray[0][0][0][0]+1
);
}
Bạn sẽ thấy rằng tất cả các giá trị 5 in trong trường hợp đầu tiên đều bình đẳng. Bởi vì chúng trỏ đến cùng một vị trí ban đầu.
Nhưng chỉ khi bạn tăng chúng lên 1 bạn thấy rằng các con trỏ khác nhau hiện đang nhảy (điểm) đến các vị trí khác nhau. Điều này là do myArray[0][0][0] + 1
sẽ nhảy qua 10 giá trị số nguyên là 40 byte, trong khi myArray[0][0] + 1
sẽ nhảy bởi 100 giá trị số nguyên, tức là 400 byte. Tương tự, myArray[0] + 1
nhảy 1000 giá trị số nguyên hoặc 4000 byte.
Vì vậy, các giá trị phụ thuộc vào mức độ cấp độ con trỏ mà bạn đang đề cập đến.
Nhưng bây giờ, nếu tôi sử dụng con trỏ để chỉ tất cả trong số họ:
#include<stdio.h>
int main()
{
int myArray[10][10][10][10]; //A 4 Dimentional array;
int * ptr1 = myArray[10][10][10];
int ** ptr2 = myArray[10][10];
int *** ptr3 = myArray[10];
int **** ptr4 = myArray;
//THESE WILL ALL PRINT THE SAME VALUE
printf("%u, %u, %u, %u\n", ptr1, ptr2, ptr3, ptr4);
//THESE ALSO PRINT SAME VALUES!!
printf("%d, %d, %d, %d\n",ptr1+1,ptr2+1,ptr3+1,ptr4+1);
}
Vì vậy, bạn thấy, mức độ khác nhau của các biến con trỏ không hành xử theo cách biến mảng không.
'tự động' không phát đẹp với con trỏ, thường không đáng tin cậy với loại loại này. – user2485710
@ user2485710 Bạn có thể giải thích về điều đó không? Bất kỳ tài liệu tham khảo/trích dẫn nào? – Domi
'auto' hoạt động tốt với con trỏ, không có đầu mối nào bạn có ý tưởng đó. –