2013-07-19 15 views
44

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ỏ?

+2

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

+0

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ỏ. –

+1

@ 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 –

Trả lời

45

Chắc chắn.

Trong C99 có ba trường hợp cơ bản, cụ thể là:

  1. khi đó là lập luận của các nhà điều hành & (địa chỉ-of).

  2. khi đó là đối số của toán tử sizeof.

  3. Khi đó là một chuỗi chữ kiểu char [N + 1] hoặc một chuỗi rộng đen của loại wchar_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ư trong char str[] = "foo"; hoặc wchar_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.

+0

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? –

+2

@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. –

+0

@GrijeshChauhan Cảm ơn :) –