Tôi đã thấy trong nhiều bài viết rằng "trong hầu hết các trường hợp mảng phân rã tên thành con trỏ".
Tôi có thể biết trong trường hợp/biểu thức tên mảng nào không phân rã thành con trỏ thành phần tử đầu tiên không?Ngoại lệ đối với mảng không phân rã thành con trỏ?
Trả lời
Chắc chắn.
Trong C99 có ba trường hợp cơ bản, cụ thể là:
khi đó là lập luận của các nhà điều hành
&
(địa chỉ-of).khi đó là đối số của toán tử
sizeof
.Khi đó là một chuỗi chữ kiểu
char [N + 1]
hoặc một chuỗi rộng đen của loạiwchar_t [N + 1]
(N
là chiều dài của chuỗi) được sử dụng để khởi tạo một mảng, như trongchar str[] = "foo";
hoặcwchar_t wstr[] = L"foo";
.
Ngoài ra, trong C11, toán tử mới được giới thiệu cũng bị phân rã thành con trỏ.
Trong C++, có các quy tắc bổ sung, ví dụ, khi nó được chuyển bằng tham chiếu.
Tôi xin lỗi, nhưng bạn có thể giải thích rõ hơn về trường hợp thứ 3 không? Tôi có nghĩa là không phải là * str * trong trường hợp thứ ba được sử dụng để chỉ đến vị trí bộ nhớ của chuỗi? Do đó một con trỏ một lần nữa? –
@TheJoker Không, đó sẽ là 'const char * str_ptr =" literal ";'. Trong ví dụ của tôi, 'str' được khai báo là một mảng, do đó nó ** là một mảng. –
@GrijeshChauhan Cảm ơn :) –
Ngữ cảnh khác là bắt buộc: Bạn có đang làm việc bằng ngôn ngữ cụ thể không? Bạn có một ví dụ? – abiessu
xem xét ngôn ngữ C. Và tôi đang tìm một ví dụ trong đó các tên mảng không phân rã thành con trỏ. –
@ TheJoker tôi đưa ra [ở đây một câu trả lời] (http://stackoverflow.com/questions/15177420/what-does-sizeofarr-return/15177499#15177499) trong đó tôi hiển thị trường hợp này –