如果将数组作为实参来调用函数,函数接收到的形参其实是一个指针。数组名是可以转换为指针的,但是数组名和指针毕竟不等价。所以,这样传递的结果是丢失了数组原有的一些特性。最大的损失莫过于sizeof对数组大小的测试。试看以下程序:
void FuncA(int *temp)
{
cout << sizeof(temp) << endl;
}
void FuncB(int temp[])
{
cout << sizeof(temp) << endl;
}
void FuncC(int temp[20])
{
cout << sizeof(temp) << endl;
}
int main()
{
int a[10];
cout << sizeof(a) << endl;
FuncA(a);
FuncB(a);
FuncC(a);
return 0;
}
三个函数的写法各有不同,但是结果却是一样的。其中FuncC的写法尤其容易产生误解。因为编译器不管你传递的是多大的数组(甚至不管是不是数组),但是函数的写法却在暗示程序员这个数组有20个成员。如果实参成员超过20个,结果就是没有起到完全的作用,如果实参成员不到20,那就指针越界了。
为避免这样的尴尬,有时我们将指针与容量一起传入函数:“void FuncD(int temp[], _size_t Size);”,或者传递两个指针:“void FuncE(int* Begin, int* End);”。这样做当然好,不过C++还有另一种办法可以不用这么麻烦,那就是引用传递:“void FuncF(int (&temp)[10]);”。这样的函数只允许将int[10]实参传入,大小不符的数组或非数组的指针都无法传入。这样就保证了10这个值的正确性,连sizeof都省了。
C语言的字符串处理函数大概是仅有的可以不受此约束的函数了。字符串就是字符数组,但是在传递字符数组时,可以只传指针而不管大小。因为C语言中的字符串都是以NULL尾的。前阵子有人在论坛提问,问及字符串和字符指针的关系。回答是:C语言的字符串是用字符数组存放的,而处理则是借助于字符指针。但是,要能进行这样的操作,有两个条件必须满足:一是所有字符连续放置在以指针开头的内存中、不跳跃,二是有一个规定的结束符。int[]数组之所以不能这样做,是因为第二个条件无法满足。
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
