重温《C++ Primer》笔记十 当数组作为函数参数时
2015-08-06 21:19
435 查看
提到数组作为实参,大家可能都会想到,数组是不能复制的,所以作为参数时不能真正得到实参数组。另外,使用数组名字的时
候,编译器会自动将其视为指针,因此它实际获得的是实参数组中首个元素的地址。没错,对于非引用数组参数是这样,但是对于
引用数组参数则是可以实现真正的数组传递的。
另外,长度值是没有任何意义的,编译器会直接忽视它。因此,下面三种方式是相同的:
长度值没有任何意义,并且容易混淆,我们在函数中使用长度值来总是不安全的。
小结:当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数
组的长度。
的了。声明如下:
上面的这种函数原型只接收类型为int,长度为10的数组。如下几种情况:
在&i、j、k三者中,只有k能够作为参数调用func函数。
在这种中情况下,在函数中我们可以任意地使用长度值了。
需要注意的地方是,&和数组名需要括号,因为下标操作[]的优先级比较高。
的就是下标越界问题。因为C++编译器并不帮助我们进行下标越界检查,因此这件事情需要我们自己去好好把握;这里有几种方法来避免下标越界:
1、在数组里面防止哨兵
就像C风格的字符串一样,总是以'\0'结尾。与此类似,我们可以在数组的末尾存放一个规定的特殊元素值作为哨兵;
2、以数组首尾位置作为实参
在STL中,容器总是有一个begin和end操作来获取首地址和尾部下一个位置地址。与此类似,我们可以传递数组的首位地址或者首
位下标。
3、直接告知数组大小
在传递数组实参时,因为长度没有任何意义,因此我们可以再添加一个参数用来传递数组的长度。
候,编译器会自动将其视为指针,因此它实际获得的是实参数组中首个元素的地址。没错,对于非引用数组参数是这样,但是对于
引用数组参数则是可以实现真正的数组传递的。
一、非引用数组形参,[]和长度值的作用
当以数组形式作为函数参数时,首先,[]的作用是告诉编译器这是个指针类型。如下两种形式是不同的:void func(int array); //参数类型为int void func(int array[]); //参数类型为int*
另外,长度值是没有任何意义的,编译器会直接忽视它。因此,下面三种方式是相同的:
void func(int *); void func(int []); void func(int [10]);
长度值没有任何意义,并且容易混淆,我们在函数中使用长度值来总是不安全的。
小结:当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型是否匹配,而不会检查数
组的长度。
二、使用引用数组形参,实现真正的数组传递
非引用数组作为参数时会被编译器看成是指针类型,但是引用数组类型的形参确实真正的数组类型。这个时候,长度值就是有意义的了。声明如下:
void func(int (&array)[10]);
上面的这种函数原型只接收类型为int,长度为10的数组。如下几种情况:
int i = 0; int j[5] =0; int k[10] = 0;
在&i、j、k三者中,只有k能够作为参数调用func函数。
在这种中情况下,在函数中我们可以任意地使用长度值了。
需要注意的地方是,&和数组名需要括号,因为下标操作[]的优先级比较高。
三、使用非引用数组参数的形式的几种规范
我们发现,数组形参被认为是指针类型还是真正的数组类型,似乎都无所谓,因为指针类型同样支持下标操作。我们唯一需要考虑的就是下标越界问题。因为C++编译器并不帮助我们进行下标越界检查,因此这件事情需要我们自己去好好把握;这里有几种方法来避免下标越界:
1、在数组里面防止哨兵
就像C风格的字符串一样,总是以'\0'结尾。与此类似,我们可以在数组的末尾存放一个规定的特殊元素值作为哨兵;
2、以数组首尾位置作为实参
在STL中,容器总是有一个begin和end操作来获取首地址和尾部下一个位置地址。与此类似,我们可以传递数组的首位地址或者首
位下标。
3、直接告知数组大小
在传递数组实参时,因为长度没有任何意义,因此我们可以再添加一个参数用来传递数组的长度。
相关文章推荐
- C语言学习资源
- C++ 获取文件夹下的所有文件名
- C++ 管道
- C++ 管道
- C++ Primer 学习笔记_76_模板和泛型编程 --模板定义[继续]
- hdu 1856 离散化+并查集
- 作为c++初学者 又给大家带来一个小程序 英文句子的首字母大写
- [知识点]C++中的运算符
- C++中你仍然不知道的事
- C语言中的可变参数。
- hdu 1325 水题
- c++ 计蒜客冗余关系
- C/C++中的二维数组动态内存分配与释放
- c语言头文件中定义全局变量的问题
- C/C++打开文件函数fopen和fopen_s用法的比较
- 黑马程序员——ios学习笔记 C语言 结构体&链表&枚举
- 简单性能测试函数模板
- C++ std::tr1::function使用
- C++第九节:多态、虚函数、抽象类
- C++多线程分析