Đây là những gì tôi tìm thấy trong thời gian học:
#include<iostream>
using namespace std;
int dis(char a[1])
{
int length = strlen(a);
char c = a[2];
return length;
}
int main()
{
char b[4] = "abc";
int c = dis(b);
cout << c;
return 0;
}
Vì vậy, trong biến int dis(char a[1])
, [1]
dường như không làm gì cả và không hoạt động
, bởi vì tôi có thể sử dụng a[2]
. Chỉ thích int a[]
hoặc char *a
. Tôi biết tên mảng là một con trỏ và cách truyền tải một mảng, vì vậy câu đố của tôi không phải là về phần này.
Những gì tôi muốn biết là tại sao trình biên dịch cho phép hành vi này ( int a[1]
). Hay nó có ý nghĩa khác mà tôi không biết?
typedef
có mảng. Vì vậy, "phân rã thành con trỏ" trong các loại đối số không chỉ là cú pháp thay thế []
bằng *
, nó thực sự đi qua hệ thống loại. Điều này có hậu quả trong thế giới thực đối với một số loại tiêu chuẩn như thế va_list
có thể được xác định bằng loại mảng hoặc loại không mảng.
int dis(char (*a)[1])
. Sau đó, bạn chuyển một con trỏ tới một mảng : dis(&b)
. Nếu bạn sẵn sàng sử dụng các tính năng C không tồn tại trong C ++, bạn cũng có thể nói những điều như void foo(int data[static 256])
và int bar(double matrix[*][*])
, nhưng đó là một loại sâu khác.