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

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)


Lig*_*ica 9

他们是不同的类型,你是对的.

这是一个误导性的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.