C++关于数组作为函数参数的值传递和指针传递

明确:
数组作为函数参数和普通的参数是有区别的;

函数中普通的参数

如同void insert(int a,int b)之类的传递分为3种方式传递

  • 值传递
  • 指针传递,指针值的传递,
  • 引用传递,它们的参数的传递是将实参的值赋给形参。

而数组作为函数参数传递:

而数组作为函数参数传递,值传递就是指针地址的传递,而这就与普通参数不一样了;因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,函数在需要用到后面元素时再按照这个地址和数组下标去查找。所以,函数调用的数组会对本身的数组造成影响,这点和普通参数的值传递是不同的。

同时,**作为函数形参的数组和指针可以互换,这种转换仅限于函数形参的声明。**这是一种便利,传递时数组会蜕变为指针,事实上数组从来没有传入过函数。

eg:以下2个声明是等价的

 void insert(int * arr);
 void insert(int arr[]);

调用:

insert(arr);

注意:因为传入数组名时,数组名代表的就是数组的首地址,所以数组名是不可以用“&”符来取别名的,即当数组作为函数参数进行传递时,不可以使用引用类型进行传递
在这里插入图片描述

且数组长度不是参数类型的一部分。函数和编译器都不知道传统给它的数组的长度的大小。——所以我们将数组作为函数参数进行传递时会另外再传入一个数组长度;

编程时的一些代码示例:

//排序函数1————数组值传递
void sortHero(Hero heroArr[],int len) {
	for (int i = 0; i < len-1; i++) {
		for (int j = 0; j < len - 1 - i; j++) {
			if (heroArr[j].age > heroArr[j + 1].age) {
				Hero temp = heroArr[j];
				heroArr[j] = heroArr[j + 1];
				heroArr[j + 1] = temp;
			}
		}
	}
}
//排序函数2————数组地址传递
void sortHero(Hero * heroArr, int len) {
	for (int i = 0; i < len - 1; i++) {
		for (int j = 0; j < len - 1 - i; j++) {
			if (heroArr[j].age > heroArr[j + 1].age) {
				Hero temp = heroArr[j];
				heroArr[j] = heroArr[j + 1];
				heroArr[j + 1] = temp;
			}
		}
	}
}
//调用:
int len = sizeof(heroArr) / sizeof(heroArr[0]);
sortHero(heroArr, len);
因为数组长度不是参数类型的一部分。函数和编译器都不知道传统给它的数组的长度的大小。==——所以我们将数组作为函数参数进行传递时会另外再传入一个数组长度len;
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

tao1151208

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值