iam*_*ind 4 c++ arrays typedef
我很难理解typedef数组的模式.
typedef char Char10[10];
void fun (Char10 a) // not passing reference (interested in pass by value)
{
if(typeid(Char10) == typeid(char*))
throw 0; // <--- never happens
}
int main ()
{
char a[10]; fun(a); // ok
char b[11]; fun(b); // why works ?
}
Run Code Online (Sandbox Code Playgroud)
为什么接受不同大小的数组值fun()?是char[10]和char[11]不是不同的类型?
编辑:对于那些说它衰减指针的人,请参阅我编辑的代码.char[10]并且char*似乎不匹配.
Naw*_*waz 22
在这两种情况下,数组都会衰减为指针类型,而您的函数实际上是这样的:
void fun (char *a);
Run Code Online (Sandbox Code Playgroud)
这就是它工作的原因.
我想强调的void fun(char*)是,完全相同void fun(char[10]).在10不作任何差别.事实上,它10是如此不重要和无用,你甚至可以完全省略它:
void fun (char a[]); //exactly same as `char*` or `char[10]`.
Run Code Online (Sandbox Code Playgroud)
这意味着,以下所有函数声明都完全相同:
void fun(char a[10]);
void fun(char a[]); //10 is unimportant in the above declaration
void fun(char *a); //same as above two declarations!
Run Code Online (Sandbox Code Playgroud)
希望澄清你的疑问.
但是,如果你这样写:
void fun (Char10 & a) ; //note &
Run Code Online (Sandbox Code Playgroud)
那么,它实际上是这样的:
void fun (char (&a)[10]) ; //equivalent!
Run Code Online (Sandbox Code Playgroud)
然后fun(b)就不会编译,因为现在fun将接受ONLY数组大小完全正确的大小10.并且数组不会衰减到指针,它将通过引用传递.
char a[10], b[11];
char *c=new char[10];
fun(a); //okay
fun(b); //error - type mismatch due to size of the array
fun(c); //error - type mismatch due to c being pointer.
Run Code Online (Sandbox Code Playgroud)
他们是不同的类型,你是对的.
这是一个误导性的C++怪癖,你可以看到它有一个功能
void fun(char a[10])
Run Code Online (Sandbox Code Playgroud)
由于你不能按值传递数组,而且C++很傻,这实际上就是函数
void fun(char* a)
Run Code Online (Sandbox Code Playgroud)
当然,两种输入都会快乐地降低char*.
如果C++不让你假装按值接受一个数组会很好,但这样做很傻.继承自C.