bhu*_*hni 7 c c++ arrays pointers
考虑一下代码:
void foo(char a[]){
a++; // works fine, gets compiled
//...
}
Run Code Online (Sandbox Code Playgroud)
现在,考虑一下:
void foo(){
char a[50];
a++; // Compiler error
//...
}
Run Code Online (Sandbox Code Playgroud)
我听说一个数组相当于一个常量指针,不能递增,因为它不是一个左值...
那么为什么第一个代码被编译,是这样的,因为函数的数组参数作为指针传递,即T []被转换为T*以传递..所以,foo(a)传递一个作为指针.
但它是否再次转换为T [],因为声明为:
void foo(char a[]);
Run Code Online (Sandbox Code Playgroud)
Pot*_*ter 10
这是从C语言继承而来的一个相当不幸的特征,其中有一个令人讨厌的名字"衰变".由于C曾经不允许按值传递复合类型,因此他们决定允许程序员将数组指定为函数参数类型,但仅限于美观.数组类型衰减为指针类型,实现了与语言其余部分不同的一种pass-by-reference语义.丑陋.
回顾(其他人已经说过这个),签名
void foo(char a[]); // asking for trouble
Run Code Online (Sandbox Code Playgroud)
是毫不客气地被篡改的
void foo(char *a);
Run Code Online (Sandbox Code Playgroud)
...所有这些都是为了与古代C代码兼容.由于您不是在编写古老的C代码,因此不应该使用这个"功能".
但是,您可以干净地传递对数组的引用.C++要求知道数组的大小:
void foo( char (&a)[ 50 ] );
Run Code Online (Sandbox Code Playgroud)
现在a无法在函数内修改(编辑:它的内容当然可以 - 你知道我的意思),并且只能传递正确大小的数组.对于其他所有内容,传递指针或更高级别的类型.