C++ 数组作为参数传入函数 int sum_arr(int arr[], int n)

首先我们要知道C++对于返回值的类型是有限制的——不能是数组

我们来看看这条语句 int sum_arr(int arr[], int n)是否是正确的呢?
这条语句是正确的,但是不是说返回值不能是数组吗?形参为啥是int arr[]还可以呢?int arr[]真的是数组吗?

arr实际上并不是一个数组,而是一个指针

我们学过数组可以知道,将数组名视为指针,我们的数组名是数组第一个元素的地址,所以我们用的是它的地址,而不是数组。

那有没有例外的情况呢?其实是有的。
(1)数组声明使用数组名来标记存储的位置。
(2)对数组名使用sizeof将得到整个数组的长度(以字节为单位)。
(3)将地址运算符&用于数组名时,将返回整个数组的地址。

所以我们可以认为:
int sum = sum_arr(cookies, ArSize);
int sum_arr(int *arr, int n);


这两个语句是一样的,我们只是用int *arr 替换了int arr[]当且仅当用于函数头或函数原型中,int *arr 和 int arr[] 的含义才是相同的,它们都是意味着arr是一个int指针

其中我们要认识两个重要的公式:
arr[ i ] == *(arr + i)
&arr[ i ] == arr + I
记住,将指针(包括数组名)加1,实际上是加上了一个与指针指向的类型的长度(以字节为单位)相等的值。可以理解为指针偏移i个元素

将数组作为参数意味着什么?
int sum_arr(int arr[], int n),实际上并没有将数组内容传递给函数,而是数组的位置(地址)、包含的元素种类(类型)以及元素数目(n的变量)提交给函数

传递常规常量时,函数将使用该变量的拷贝;但传递数组时,函数将使用与原来的数组。但这不违反C++按值传递的方法,sum_arr()还是传递了一个值,这个值被赋给一个新变量,但这个值是一个地址,而不是数组的内容。

将数组名与指针对应,可将数组地址作为参数可以节省复制整个数组所需的时间和内存,但是使用原始数据增加了破坏数据的风险。我们可以采用const限定符提供解决这中问题。

总结:

1、我们可以将数组作为形参写进函数的,eg:int sum_arr(int arr[], int n),我们要正确了解,int arr[]不是数组,而是指针,我们只是写成了数组的形式,它本质还是指针
2、为将数组类型和元素数量告诉数组处理函数,我们要用两个不同的参数来传递它们,eg:void fillArray(int arr[], int size)

3、不要试图使用方括号表示法来传递数组长度,eg:void fillArray( int arr[size] )是错误的

程序例子:

#include <iostream>

const int ArSize = 8;

using namespace std;

int sum_arr(int arr[], int n);

int main(void)
{
	int cookies [ArSize] = {1,2,4,8,16,32,64,128};
	cout << cookies << " = array address, " << endl;
	cout << sizeof(cookies) << " = sizeof cookies " <<endl;
	
	int sum = sum_arr(cookies, ArSize);
	cout << "Total cookies eaten: " << sum << endl;
	sum = sum_arr(cookies, 3);
	cout << "First three eaters ate " << sum << " cookies " << endl;
	sum = sum_arr(cookies + 4, 4);
	cout << "Last four eaters ate " << sum << " cookies." << endl;
	
	return 0;
}

int sum_arr(int arr[], int n)
{
	int total = 0;
	cout << arr << " = arr, " << endl;
	cout << sizeof(arr) << " = sizeof arr" << endl;
	for (int i = 0;i < n ; i++)
		total = total + arr[i];
	return total;	
}

运行结果:

0x9ff8fc = array address,
32 = sizeof cookies
0x9ff8fc = arr,
4 = sizeof arr
Total cookies eaten: 255
0x9ff8fc = arr,
4 = sizeof arr
First three eaters ate 7 cookies
0x9ff90c = arr,
4 = sizeof arr
Last four eaters ate 240 cookies.

--------------------------------
Process exited after 0.3507 seconds with return value 0
请按任意键继续. . .

  • 13
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄TimTim仔

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值