一级棒(Eachfun)
一级棒 - 读书笔记 - C++ Primer - 传递数组的函数与字符串函数
RSS订阅
传递数组的函数与字符串函数
发表时间:2006-07-31 02:31:41 关键词:C++,MFC,VC,Primer,编程,教程,读书

  如果将数组作为实参来调用函数,函数接收到的形参其实是一个指针。数组名是可以转换为指针的,但是数组名和指针毕竟不等价。所以,这样传递的结果是丢失了数组原有的一些特性。最大的损失莫过于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[]数组之所以不能这样做,是因为第二个条件无法满足。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!