char []
biểu thị kiểu "mảng không rõ ràng buộc của char", trong khi char *
biểu thị kiểu " trỏ đến char ". Như bạn đã quan sát, khi định nghĩa của một biến kiểu "mảng không xác định ràng buộc của char" được khởi tạo với một chuỗi chữ, kiểu được chuyển thành "mảng [N] của char" trong đó N là kích thước thích hợp. Điều tương tự cũng áp dụng chung cho việc khởi tạo từ tập hợp mảng:
int arr[] = { 0, 1, 2 };
arr được chuyển thành loại "mảng [3] của int".
Trong một định nghĩa kiểu người dùng định nghĩa (struct
, class
hoặc union
), mảng-of-biết-bound loại đều bị cấm trong C++, mặc dù trong một số phiên bản của C họ được phép như thành viên cuối cùng của một struct , nơi chúng có thể được sử dụng để truy cập bộ nhớ được cấp phát qua phần cuối của cấu trúc; cách sử dụng này được gọi là "mảng linh hoạt".
Xây dựng kiểu đệ quy là một sự khác biệt; người ta có thể xây dựng con trỏ đến và mảng của char *
(ví dụ: char **
, char (*)[10]
) nhưng điều này là bất hợp pháp đối với mảng không rõ ràng; người ta không thể viết char []*
hoặc char [][10]
(mặc dù char (*)[]
và char [10][]
vẫn ổn).
Cuối cùng, chứng chỉ cv hoạt động khác nhau; được đưa ra typedef char *ptr_to_char
và typedef char array_of_unknown_bound_of_char[]
, cv-qualifiying phiên bản con trỏ sẽ hoạt động như mong đợi, trong khi cv-qualifying phiên bản mảng sẽ di chuyển cv-qualification thành loại phần tử: nghĩa là, const array_of_unknown_bound_of_char
tương đương với const char []
và không phải là hư cấu char (const) []
. Điều này có nghĩa là trong định nghĩa hàm, trong đó phân rã mảng-con trỏ hoạt động trên các đối số trước khi tạo mẫu thử nghiệm,
void foo (int const a[]) {
a = 0;
}
là hợp pháp; không có cách nào để làm cho tham số mảng không xác định bị ràng buộc không thể sửa đổi được.
Mặc dù tiêu đề giống hệt nhau, nhưng câu hỏi này thực sự có nhiều thông tin hơn. Chúng ta nên mở lại! – ltjax
@ltjax Và bạn đã đúng. Lỗi của tôi để kích hoạt hạnh phúc. Bình chọn mở lại. – Mysticial
'' char * c = "test"; '' là một mã không chuẩn. Giá trị đúng là '' const char * c = "test"; '' –