总是搞不清楚指针、引用、数组、数组指针、指针数组等等一堆东西之间的关系和用法,学习C++ Primer之后,稍作总结,希望对需要的人有帮助,以下的文字基本上都是来自C++ Primer3的书中
1、数组参数:
int* 、int[] 、 int[ 10 ]作为函数的参数是等价的,在被调函数内对参数数组的改变将被应用到数组实参上而不是本地拷贝上。
数组长度不是参数类型的一部分函数不知道传递给它的数组的实际长度编译器也不知道当编译器对实参类型进行参数类型检查时并不检查数组的长度
2、传递数组长度的方法
①是提供一个含有数组长度的额外参数
void putValues( int[], int size );
②是将参数声明为数组的引用
void putValues( int (&arr)[10] );
③是使用抽象容器类型
void putValues( vector<int> vec )
另:
参数也可以是多维数组这样的参数必须指明第一维以外的所有维的长度例如:
void putValues( int matrix[][1a], int rowSize );多维数组的参数类型检查只检验多维数组实参中除了第一维之外的所有维的长度与参数的是否相同
int *matrix[ 10 ];将matrix 声明成一个含有10 个指向int 的指针的数组
int (*matrix)[10];把matrix 声明成一个二维数组每行由10 个列元素构成matrix
int (&arr)[10];将参数声明为数组的引用当参数是一个数组类型的引用时数组长度成为参数和实参类型的一部分编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配
3、指针和引用作为参数的优缺点,以及何决定使用:
两种参数都允许函数修改实参指向的对象,两种类型的参数都允许有效地向函数传递大型类对象
指针可能指向一个对象或没有任何对象所以函数在确定指针实际指向一个有效的对象之前不能安全地解引用一个指针;对于引用参数函数不需要保证它指向一个对象引用必须指向一个对象甚至在我们不希望这样时也是如此。
如果一个参数可能在函数中指向不同的对象或者这个参数可能不指向任何对象则必须使用指针参数;引用参数的一个重要用法是它允许我们在有效地实现重载操作符的同时还能保证用法的直观性