继前边已经写过的 指针的 相关内容(点击理解指针参考),这篇文章写写函数的参数传递~~~因为二者分不开的
搜 “函数的参数传递”, 很多时候看到的是函数的三种传递方式~~~
那么这三种参数传递方式有没有什么共同点呢?或者说它们的实质到底是怎样的呢?
(1)、写一个带有参数的函数
返回值类型 函数名(形参列表){//参数列表之间用 , 隔开
....//操作代码
return 返回值类型的变量或者常量;
}
那么形参列表怎么写呢?
其实我们可以按照 定义一个变量的写法 来写形参列表,什么意思呢?
定义一个int型变量代码为 int a; (或者int a=2;) ; 那么在形参列表里边可以写 int a
定义一个char型变量代码为 char b;(或者char b='s';); 那么在形参列表里边可以写 char b
定义一个指针变量代码为 int *p;那么我们在形参列表里边可以写 int *p
定义一个引用变量代码为 int &d=a; 那么我们在形参列表里边可以写 int &d
大家有没有发现什么规律呢?
那就是写形参列表的时候,只要写出 相对应的定义代码的等号“=” 之前的部分就好了~~~~~
或许大家不禁要问 这样写对不对呢?有依据吗?
下面来解释一下~~~~~
(2)、参数传递的实质
我们知道函数的参数列表是用来接收外部送来的信息的,可以理解为接受输入
void test1(int a, int *p, int &d){
...
}
int main(){
int aa=1;
int ad=2;
int arrayP[2]={8,9};
int *pp=arrayP;
int &dd=aa;
test1(aa, pp, dd);//调用函数test1
return 0;
}
在调用函数(main(实参列表)) 调用 被调用函数(test1(形参列表)) 的时候,要进行参数传递,这个过程的进行其实就是一个定义以及赋值~~~
其实执行的是下边的语句:
int a=aa; //系统为 a 分配空间,将 aa 的值赋值给a
int *p=pp; //系统为 p 分配空间,将 pp 的值赋值给p
int &d=dd; //系统不为 d 分配空间,给 dd 所代表的空间取了另一个名字 d,d 的值 和 dd 的值是一个实体
可以理解为 形参是定义语句中等号之前的部分,函数被调用的时候 实参 是等号之后的部分,调用的时候进行了定义和赋值操作,形参=实参~~~~~
现在有没有理解了 形参的写法呢?
现在来想一想下边的问题,我们在 test1 代码里:
修改 a 的值,会改变 aa 的值吗?不会,因为 a 和 aa 代表的是不同的空间呀~~~~~
修改 p 的值,会改变 pp 的值吗?不会,因为 p 和 pp 代表的是不同的空间呀~~~~~
在不修改 p 值的情况下,修改 *p 的值,会改变 *pp 的值吗?会的,因为 p 和 pp 是相同的地址,指向的是同一个空间呀,只要改变了这个空间中的内容,这个内容就变了~~~~~
修改 d 的值,会改变 dd 的值吗?会的,因为 d 和 dd 代表的是一样的东西,不管通过哪个名字(d 或者是 dd)将这个东西改变了,那这个东西就变了~~~~~
(3)、关于数组形参的写法
数组的形参写法有两种,一种是 int array[](或者是 int array[常量] ), 另一种是 int *array。可以参考c++定义一个数组一定要给出长度吗?
其实定义数组有两种定义方式,静态和动态:
int array[10]={1,2,3,4,5,6,7,8,9,0};//静态定义方式
int array[]={1,2,3,4,5,6,7,8,9,0};//静态定义方式
int num=10;
int * array=new int[num];//动态定义方式,num可以为变量,可以为常量
所以数组在形参列表中的写法可以有两种,一种静态写法,一种是动态写法~~~~~
(只不过 如果套用上边的 “形参=实参”,得到的是int array[]=arrayarray; 这个写法是不正确的,但是可以不必再想太多,在形参列表里写 定义变量语句等号左边的内容就好了~~~~~)