IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ 函数- 数组形参 -> 正文阅读

[C++知识库]C++ 函数- 数组形参

1. 数组有两个特殊的性质:

  • 不允许数组的拷贝和赋值:不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。(一些编译器支持数组的赋值,这就是所谓的编译器扩展,最好避免使用非标准特性)

    int a[] = {0 ,1 ,2};	// 含有三个整数的数组
    int a2[] = a;	//【错误】 不允许使用一个数组初始化另一个数组
    a2 = a;		// 【错误】不允许把一个数组的值,直接赋给另一个数
    
  • 使用数组时,通常会将其转化成指针。

通过以上两个性质可以看出,数组无法拷贝,因此数组无法以值传递的方式使用数组参数。因为数组会被转换成指针,所以当我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针。

2.函数数组形参的传递

尽管不能以值传递的方式传递数组,但是可以写成形参类似数组的形式:

// 尽管形式不同,但是这三个print函数是等价的
// 每个函数都有一个const int*类型的形参
void print(const int*);		
void print(const int[]);			// 可以看出,函数的意图是作用于一个数组
void print(const int[10]);			// 这里的维度表示我们期望数组含有多少个元素,实际上不一定

尽管表现形式不同,但上面三个参数是等价的:每个函数唯一的类型的形参都是 const int* 类型的。函数在运行时,只检查传入的参数是否为const int*

注意:和其他使用数组的代码一样,以数组作为形参的函数也必须保证使用数组时不会越界。

因为数组,是以指针的形式传递给函数的,所以数组一开始并不知道数组的确切尺寸。通常有三种方法对数组进行管理。

  • 使用标记制定数组长度
void print(const char *cp)
{
    if(cp)					//  若cp不是一个空的指针
        while(*cp)			 //  指针所指的字符不是空字符
            cout << *cp++;	  //  输出当前字符并将指针向前移动一个位置
}

该种方法只适用于那些有明显结束标记不会与普通数据混淆的情况,但是对于像int这种所用取值都合法的数据就不太好处理了。

  • 使用标记制定数组长度
void print(const int *beg, const int *end)
{
    //输出beg到end之间(不含end)的所有元素
    while(beg != end)
        cout << *beg++ << endl;
}
  • 显示传递一个表示数组大小的形参
//const int ia[] 等价于const int* ia
// size 表示数组的大小,将它显示地传给函数用于控制对ia元素的访问
void print (const int ia[], size_t size)
{
    for(size_t i = 0; i != size; ++i)
    {
        cout << ia[i] << endl;
    }
}

3.函数数组的引用传值

C++语言允许将变量定义成数组引用,基于同样的道理,形参也可以是数组的引用。此时,引用形参绑定到对应的实参上,也就是绑定到数组上。

// 正确: 形参是数组的引用,维度是类型的一部分
void print(int (&arr)[10])			// 特别注意 &arr两端的地址不能省略
{
    for(auto elem : arr)
    {
		cout << elem << endl; 
    }
}

上述写法,数组的大小构成数组的一部分,只要不超过维度,就可以在函数体内,放心使用数组。但是,这一用法无形中,限制了print函数的可用性,我们只能将函数作用于大小为10的数组。

int i = 0, j[2] = {0, 1};
int k[10] = {0,1,2,3,4,5,6,7,8,9};
print(&i);			//【错误】: 实参不是含有10个整数的数组
print(j);			//【错误】: 实参不是含有10个整数的数组
print(k);			//【正确】: 实参含有10个整数的数组

参考:《C++ primer》

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 11:44:21  更:2021-09-01 11:45:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 20:27:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计