Có vẻ như bạn đang nhầm lẫn giữa các con trỏ và mảng. Con trỏ và mảng (trong trường hợp này char *
và char []
) là not the same thing.
- Một mảng
char a[SIZE]
nói rằng giá trị tại vị trí của a
là một mảng có độ dài SIZE
- Một con trỏ
char *a;
nói rằng giá trị tại vị trí của a
là con trỏ đến số char
. Điều này có thể được kết hợp với con trỏ số học để hành xử như một mảng (ví dụ, a[10]
là 10 mục qua bất cứ nơi nào a
điểm)
Trong trí nhớ, nó trông giống như thế này (ví dụ lấy từ the FAQ):
char a[] = "hello"; // array
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
char *p = "world"; // pointer
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+
Thật dễ nhầm lẫn về sự khác biệt giữa con trỏ và mảng, bởi vì trong nhiều trường hợp, tham chiếu mảng "phân rã" thành con trỏ đến phần tử đầu tiên. Điều này có nghĩa rằng trong nhiều trường hợp (chẳng hạn như khi được truyền cho một cuộc gọi hàm) các mảng trở thành con trỏ. Nếu bạn muốn biết thêm, this section of the C FAQ describes the differences in detail.
Một sự khác biệt thực tế chính là trình biên dịch biết một mảng dài bao lâu. Sử dụng các ví dụ trên:
char a[] = "hello";
char *p = "world";
sizeof(a); // 6 - one byte for each character in the string,
// one for the '\0' terminator
sizeof(p); // whatever the size of the pointer is
// probably 4 or 8 on most machines (depending on whether it's a
// 32 or 64 bit machine)
Nếu không thấy mã của bạn, bạn nên chuyển sang sử dụng con trỏ ở mọi nơi sẽ giải quyết được sự cố bạn đang gặp phải.Lưu ý rằng bây giờ:
Bạn sẽ cần phải khởi tạo bộ nhớ ở bất kỳ nơi nào mảng sử dụng. Ví dụ: char a[10];
sẽ trở thành char *a = malloc(10 * sizeof(char));
, tiếp theo là séc là a != NULL
. Lưu ý rằng bạn không thực sự cần phải nói sizeof(char)
trong trường hợp này, bởi vì sizeof(char)
được định nghĩa là 1. Tôi đã để nó đầy đủ.
Anywhere bạn trước đây đã sizeof(a)
cho chiều dài mảng sẽ cần phải được thay thế bằng chiều dài của bộ nhớ mà bạn phân bổ (nếu bạn đang sử dụng chuỗi, bạn có thể sử dụng strlen()
, mà đếm lên đến '\0'
).
Bạn sẽ cần thực hiện cuộc gọi tương ứng tới free()
cho mỗi cuộc gọi đến malloc()
. Điều này nói với máy tính bạn đang thực hiện bằng cách sử dụng bộ nhớ bạn yêu cầu với malloc()
. Nếu con trỏ của bạn là a
, chỉ cần viết free(a);
tại một điểm trong mã mà bạn biết bạn không còn cần bất cứ điều gì a
trỏ tới.
Như câu trả lời khác chỉ ra, nếu bạn muốn để có được địa chỉ của người khởi đầu của một mảng, bạn có thể sử dụng:
char* p = &a[0]
Bạn có thể đọc là "char trỏ p
trở thành địa chỉ của phần tử [0]
của a
".
Nguồn
2012-03-09 02:53:01
Đọc phần 6 của [comp.lang.c FAQ] (http://c-faq.com/). –