Nguồn tuyệt vời để làm sáng tỏ sự nhầm lẫn là Peter Van der Linden, Chuyên gia lập trình C, bí mật sâu C - mảng và con trỏ không giống như cách chúng được giải quyết trong bộ nhớ.
Với một mảng,
char new_str[];
trình biên dịch đã cung cấp cho new_str một địa chỉ bộ nhớ được biết ở cả trình biên dịch và thời gian chạy, ví dụ: 0x1234, do đó việc lập chỉ mục của new_str là đơn giản bằng cách sử dụng
[]
. Ví dụ:
new_str[4]
, khi chạy, mã sẽ chọn địa chỉ của nơi
new_str
nằm trong, ví dụ: 0x1234 (đó là địa chỉ trong bộ nhớ vật lý).bằng cách thêm chỉ số chỉ số
[4]
vào nó, 0x1234 + 0x4, giá trị có thể được truy lục.
Trong khi đó, với con trỏ, trình biên dịch cung cấp cho biểu tượng
char *newstr
một địa chỉ, ví dụ: 0x9876, nhưng vào thời gian chạy, địa chỉ đó được sử dụng, là một lược đồ địa chỉ gián tiếp. Giả sử rằng newstr là malloc'd
newstr = malloc(10);
, những gì đang xảy ra là, mỗi khi một tham chiếu trong mã được thực hiện để sử dụng newstr, vì địa chỉ của newstr được biết đến bởi trình biên dịch tức là 0x9876, nhưng newstr trỏ đến biến là gì. Khi chạy, mã tìm nạp dữ liệu từ bộ nhớ vật lý 0x9876 (tức là newstr), nhưng tại địa chỉ đó, một địa chỉ bộ nhớ khác (vì chúng ta malloc'd nó), ví dụ 0x8765 nó ở đây, mã lấy dữ liệu từ địa chỉ bộ nhớ đó malloc được gán cho newstr, tức là 0x8765.
Các char new_str[]
và char *newstr
được sử dụng thay thế cho nhau, vì một số yếu tố 0 của mảng phân rã thành một con trỏ và giải thích lý do tại sao bạn có thể newstr[5]
hay *(newstr + 5)
Thông báo như thế nào biểu hiện con trỏ được sử dụng mặc dù chúng tôi đã tuyên bố char *newstr
, do đó
*(new_str + 1)
= *newstr;
HOẶC
*(new_str + 1)
= newstr[1];
Tóm lại, sự khác biệt thực sự giữa hai cách là cách chúng được truy cập trong bộ nhớ.
Tải sách, đọc và sống và hít thở. Đó là một cuốn sách tuyệt vời! :)
Hãy xem hướng dẫn tuyệt vời này http://pw2.netcom.com/~tjensen/ptr/cpoint.htm – jyz