我很难理解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 ?
}
为什么按值排列的数组的不同大小被接受fun()
? Are char[10]
and char[11]
不是不同类型?
Edit:对于那些说它衰减为指针的人,请参阅我编辑的代码。char[10]
and char*
似乎不匹配。
在这两种情况下,数组decay到指针类型,你的函数是actually this:
void fun (char *a);
这就是它起作用的原因。
我想强调的是void fun(char*)
与void fun(char[10])
. The 10
根本没有任何区别。实际上,10
是如此不重要和无用,你甚至可以完全省略它:
void fun (char a[]); //exactly same as `char*` or `char[10]`.
这意味着,all以下函数声明是exactly same:
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!
希望能澄清您的疑问。
但是,如果你这样写:
void fun (Char10 & a) ; //note &
那么,它实际上是这样的:
void fun (char (&a)[10]) ; //equivalent!
Then fun(b)
无法编译,就像现在一样fun
将只接受大小恰好为 10 的数组。并且该数组将not衰变到pointer,它将被通过参考.
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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)