CPP学习之——传递与接收(14.14)

一 概述

我们从两个角度上来看这个问题,第一个角度是站在数组的立场上,看看数组是如何传递参数给函数,第二个角度是站在函数的立场上,看看函数如何接收一个来自数组的地址以及如何返回一个地址

二 传递与接收分析

我们先站在第一个角度,也就是数组向函数传递参数的角度上看这个问题:

  • 与传递一个普通变量不同,在C++里,是不能将整个数组传递给一个函数的。但是从上一节课中我们了解到数组在定义的时候系统自动创建一个指向该数组的指针,并且该指针自动指向该数组的第一个元素。因此,我们可以通过传递数组的名字,把一个指向数组的指针传递给函数

  • 打个比方:一个学校进行了一次期末考斯,然后将班级的期末考试成绩汇总起来,每个班的第一名和班名作为索引。假定一个班就是一个数组,该班的名称就是数组名,该班的第一名就是数组的第一个元素。某班的班主任要处理本班级学生的成绩,那么教务处就要给他传递该班级的成绩表,他传递的方式有两种,第一种是将该班级的成绩复制一份送交班主任,另一种方式将全校的考试成绩给该班主任看,并将该班级在学校各个班级汇总成绩表上所处的位置指给班主任。

  • 由于该校的校长非常小气,他认为将各个班级的成绩都复制一份送交每个班的班主任,那将会浪费多少纸张啊。而且还要复制还要打印,非常耽误时间。叫他们直接来看不就得了,因此该校一般都采用第二种方式

  • 这次该班主任仍旧延续该校的一贯作风,根据教务处给出该班在全校成绩单上所处的位置,也就是该班的班级名,找到了该班第一名的成绩,因为班名和第一名成绩都被学校做了索引,所以班名所处的位置和该班第一名的位置是相同的,班主任找到了该班第一名的位置,那么想要查找和修改该班其他学生的成绩就易如反掌了

  • 我们把该班班主任查找并修改该班学生成绩的一系列行为定义为一个函数,那么教务处通知班主任来产看分数就是一个调用函数的过程,在通知的同时告知班主任该班成绩在全校成绩单上的位置就是传递了一个数组参数(数组名)

  • 我们再站在函数接受数组地址的角度上,也就是班主任接收教务处通知的角度上。由于班主任当天也可能会有事,因此班主任要声明三种接收状态 ,以免接收不到或者接收到错误信息。假定函数名为func,要接受的数组名为a,那么

  • 第一种:班主任委托班长接收。由于班长对该班有多少学生非常了解,因此班主任不用嘱咐他班里有多少人,需要查看多少人的分数,因此声明为:

    1
    void func(int a[]){}//a是个形式参数,也可用别的字母代替 
  • 第二种:班长有事,班主任委托看大门老头。由于老头不清楚共有多少学习,所以班主任特意说明了一下:

    1
    void func(int a[30]){}
  • 第三种:班主任亲自接收。班主任作为一个指针亲自接收数组并访问数组

    1
    void func(int *a){}
  • 第一种方式是简要数组声明,第二种方式是标准数组声明,第三种是指针声明。由于这三种方式都告诉编译器将要收到一个指向整数的指针,因此这三种声明方式都没有错误,并且返回类似的结果。

  • 班主任认为某一个数据有出入,那么就要通知教务处进行修改。即函数返回一个值或者在函数体内对数组元素进行修改。由于我们为了节省纸张(内存)的缘故,没有拷贝一份该班的成绩,因此是在原始数据(数组元素)上进行修改,数组修改完毕(该函数调用结束后),也就代表着原始数据修改完毕

三 示例演示及结果输出

3.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
int func(int x[])
{
x[0]=100;
return x[0];
}
int main()
{
int x[30];
cout<<"修改后的成绩为:"<<func(x)<<endl;
return 0;
}

3.2 输出结果

1
修改后的成绩为:100