Có nó thừa hưởng từ C. Chức năng:
void foo (char a[100]);
sẽ có các tham số điều chỉnh để có một con trỏ, và do đó trở thành:
void foo (char * a);
Nếu bạn muốn loại mảng được giữ nguyên, bạn nên chuyển tham chiếu đến mảng:
void foo (char (&a)[100]);
C++ '03 8.3.5/3:
... Các loại một chức năng được xác định bằng cách sử dụng quy tắc sau đây. Kiểu của mỗi tham số được xác định từ trình khai báo-khai báo-seq và khai báo của chính nó. Sau khi xác định loại của mỗi thông số, bất kỳ tham số nào của loại "mảng T" hoặc "hàm trả về T" được điều chỉnh thành "con trỏ tới T" hoặc "con trỏ đến hàm T trả về T", tương ứng ....
Để giải thích cú pháp:
Kiểm tra quy tắc "bên trái" trong google; Tôi đã tìm thấy một mô tả về nó here.
Nó sẽ được áp dụng cho ví dụ này xấp xỉ như sau:
void foo (char (&a)[100]);
Bắt đầu ở dạng 'a'
'a' là một
Move đúng - chúng ta thấy a )
vì vậy chúng tôi đảo ngược hướng tìm kiếm (
. Như chúng ta đã di chuyển trái chúng tôi vượt qua &
'a' là một tài liệu tham khảo
Sau &
chúng ta đạt đến việc mở (
vì vậy chúng tôi đảo ngược một lần nữa và nhìn bên phải. Bây giờ chúng ta thấy [100]
'a' là một tham chiếu đến một mảng của 100
Và chúng ta đảo ngược hướng một lần nữa cho đến khi chúng ta đạt char
:
'a' là một tham chiếu đến một mảng 100 ký tự
Nguồn
2009-08-25 13:22:38
tôi luôn luôn sử dụng std :: mảng trong những trường hợp này, ngăn chặn việc phải đối phó với các vấn đề như thế này và làm việc với các thuật toán std quá – paulm
gì nghiêm ngặt loại an toàn? Ai đã hứa an toàn loại nghiêm ngặt? Không có điều như vậy trong C++. –
TL; DR cho câu trả lời dưới đây: Mảng trở thành con trỏ khi được chuyển đến hàm, vì vậy khi bạn kiểm tra kích thước của chúng, tất cả những gì bạn nhận được là kích thước của con trỏ. Nếu bạn đang làm việc với chỉ C, tất cả những gì tôi có thể đề nghị là bạn tính trước bất kỳ kích thước nào bạn đang cố gắng thoát khỏi mảng như một tham số khác. –