Xem xét các báo cáo sau:Số học và mảng con trỏ: điều gì thực sự hợp pháp?
int *pFarr, *pVarr;
int farr[3] = {11,22,33};
int varr[3] = {7,8,9};
pFarr = &(farr[0]);
pVarr = varr;
Ở giai đoạn này, cả hai con trỏ đang trỏ vào đầu của mỗi địa chỉ mảng tương ứng. Đối với * pFarr, chúng tôi hiện đang tìm kiếm tại 11 và cho * pVarr, 7.
Tương tự, nếu tôi yêu cầu nội dung của từng mảng thông qua * Farr và * varr, tôi cũng có được 11 và 7.
Vì vậy, rất tốt.
Bây giờ, hãy thử pFarr++
và pVarr++
. Tuyệt quá. Chúng tôi hiện đang xem 22 và 8, như mong đợi.
Nhưng bây giờ ...
Đang cố gắng để di chuyển lên farr++
và varr++
... và chúng tôi có được "loại sai trong lập luận để tăng".
Bây giờ, tôi nhận ra sự khác biệt giữa một con trỏ mảng và một con trỏ thông thường, nhưng vì hành vi của chúng tương tự nhau, tại sao giới hạn này? Điều này còn gây nhầm lẫn cho tôi khi tôi cũng xem xét rằng trong cùng một chương trình, tôi có thể gọi hàm sau theo cách có vẻ đúng đắn và theo cách khác không chính xác, và tôi nhận được hành vi tương tự, mặc dù ngược lại với những gì đã xảy ra mã được đăng ở trên !?
working_on_pointers (pFarr, farr); // calling with expected parameters
working_on_pointers (farr, pFarr); // calling with inverted parameters
.
void working_on_pointers (int *pExpect, int aExpect[]) {
printf("%i", *pExpect); // displays the contents of pExpect ok
printf("%i", *aExpect); // displays the contents of aExpect ok
pExpect++; // no warnings or errors
aExpect++; // no warnings or errors
printf("%i", *pExpect); // displays the next element or an overflow element (with no errors)
printf("%i", *aExpect); // displays the next element or an overflow element (with no errors)
}
Ai đó có thể giúp tôi hiểu tại sao các con trỏ mảng và con trỏ hoạt động theo cách tương tự trong một số ngữ cảnh, nhưng khác nhau ở các ngữ cảnh khác?
Cảm ơn rất nhiều.
EDIT: Noobs như bản thân mình hơn nữa có thể được hưởng lợi từ tài nguyên này: http://www.panix.com/~elflord/cpp/gotchas/index.shtml
' Đang cố gắng để di chuyển lên Farr ++ và varr ++ ... và chúng tôi có được" loại sai trong lập luận để tăng, incrementing của một mảng không được phép, là tất cả. Và, bạn không cần dấu ngoặc đơn trong & (farr [0]);) Con trỏ là __NOT__ mảng! –
"Tôi nhận ra sự khác biệt giữa một con trỏ mảng và một con trỏ thông thường". Rõ ràng, bạn không. Không có thứ như "con trỏ mảng". Mảng không phải là một con trỏ, dấu chấm. Bạn không thể tăng mảng. – AnT
điều này là đúng. tuy nhiên khi bạn xem xét rằng trình biên dịch giảm mảng đến con trỏ trong các hàm, thì bạn có thể thấy một người mới sẽ nghĩ rằng một mảng đã được tăng lên như thế nào, trong thực tế nó là một con trỏ. – bitcruncher