gpt4 book ai didi

c++ - 按值传递 typedef(固定大小)数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:38 25 4
gpt4 key购买 nike

我很难理解数组的 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() 接受按值排列的不同大小的数组? char[10]char[11] 不是不同的类型吗?

编辑:对于那些说它衰减为指针的人,请参阅我编辑的代码。 char[10]char* 似乎不匹配。

最佳答案

在这两种情况下,数组退化为指针类型,而您的函数实际上是这样的:

void fun (char *a); 

这就是它起作用的原因。

我想强调的是 void fun(char*)void fun(char[10]) 完全相同。 10 根本没有任何区别。事实上,10 是如此的不重要和无用,你甚至可以完全忽略它,因为:

void fun (char a[]); //exactly same as `char*` or `char[10]`.

这意味着,所有以下函数声明完全相同:

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!

那么 fun(b) 将无法编译,因为现在 fun 将只接受大小为 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.

关于c++ - 按值传递 typedef(固定大小)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6033970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com