博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 数组形参
阅读量:6430 次
发布时间:2019-06-23

本文共 1678 字,大约阅读时间需要 5 分钟。

数组形参会被弱化为指针,所以处理数组的函数通常通过指向数组中元素的指针来处理数组。

// three equivalent definitions of printValuesvoid printValues(int *) { /* … */ }void printValues(int []) { /* … */ }void printValues(int [10]) { /* … */ }

上面3种定义等价,形参类型都是int *,通常使用第1种。第2种形式虽然看起来更直观,但容易引起误解,因为函数操纵的毕竟不是数组本身,而是指向数组元素的指针。第3种形式的数组长度是被忽略的,这里的10并无实际的约束作用,在printValues内部不应依赖这个数组长度做事情。

和其他类型一样,形参也可以是数组的引用。这时编译器不会将数组实参转换为指针,而是传递数组的引用本身。数组大小成为形参和实参类型的一部分。编译器检查数组实参的大小与形参的大小是否匹配。

// ok: parameter is a reference to an array; size of array is fixedvoid printValues(int (&arr)[10]) {     for (size_t i = 0; i != 10; ++i)        cout << arr[i] << endl;}int main(){    int i = 0, j[2] = {
0, 1}; int k[10] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; printValues(&i); // error: argument is not an array of 10 ints printValues(j); // error: argument is not an array of 10 ints printValues(k); // ok: argument is an array of 10 ints return 0;}

这个版本的printValues只严格接受含有10个ints的数组,所以在printValues函数体内依赖数组大小也是安全的。&arr两边的括号是必须的,否则int &arr[10],会被当做是含有10个引用的数组。

也可以传递多维数组,所谓多维数组实际就是数组的数组。多维数组同样以指向首元素的指针方式传递。除了第一维以外的所有维的长度都必须明确指定。

// first parameter is an array whose elements are arrays of 10 intsvoid printValues(int (*matrix)[10], int rowSize);void printValues(int matrix[][10], int rowSize);

实际上形参还是被弱化为一个指针,只不过它现在所指向的是含有10个ints的数组。

因为非引用型数组形参被弱化为指针,所以无法得知数组的大小,这就容易造成数组越界。一般处理方法有以下三种。

(1)在数组尾端放置一个结束标记,类似于c-style字符串的\0结束符。

(2)传递指向数组的第一个和最后一个元素的下一位置的指针,c++标准库程序采用这种方法。

void printValues(const int *beg, const int *end){    while (beg != end)         cout << *beg++ << endl;}

(3)显示传递表示数组大小的形参

void printValues(const int ia[], size_t size){    for (size_t i = 0; i != size; ++i)        cout << ia[i] << endl;}

【学习资料】 《c++ primer》

转载地址:http://dotga.baihongyu.com/

你可能感兴趣的文章
剑指offer:第一个只出现一次的字符
查看>>
protobuf for lua in Mac
查看>>
决策树
查看>>
Web 前端颜色值--字体--使用,整理整理
查看>>
五、MySQL 创建数据库
查看>>
redis安全配置
查看>>
作业15-导航,头部,CSS
查看>>
DecimalFormat用法
查看>>
用javascript去掉字符串空格的办法
查看>>
test
查看>>
JAVA编程题-用java解决兔子问题
查看>>
pychon笔记
查看>>
[转] Web前端研发工程师编程能力飞升之路
查看>>
简单理解桶排序
查看>>
C#项目代码规范
查看>>
vscode常用插件
查看>>
算法的时间复杂度比较,计算多项式的直接法和秦九韶法
查看>>
SQL SERVER与C#的数据类型对应表
查看>>
Eclipse 教程
查看>>
Search in Rotated Sorted Array II
查看>>