零 目录
- 一 准备工作
- 实参与形参
- 全局变量
- 非全局变量(或称局部变量)
- 二 传输地址或数值
- 传输数值
- 传输地址
- 对比
- 三 总代码
一 准备工作
——讲解涉及到的概念将在这个模块讲解。
1 实参与形参
形参:也就是“形式参数”,是在定义函数名和函数体时会用到的参数,目的是用来接收在其他的代码片段调用该函数时传递的参数。比如你定义了一个函数 int cgz(int n, int m);
这里的 n, m 就是形参,它们只是一个“空”,接收实参传来的数值。或者说,实参的值传给形参,就是一道……填空题?
实参:也就是"实际参数",是在调用时传递给函数的参数,也就是说,传递给被调用函数的,是一个数值。比如说,你在主函数中定义了两个变量 a、b,然后在接下来一行写下C++标准库中的max()函数,这时你写到max(a, b);
,这时的 a, b 就是实参,他们把自己的值传输给了max()函数处理,然后返回了一个最大值。
2 全局变量
有些自定义函数,在定义时程序员并没有写上形参的语句。就像这样:
void example( );
^无形参
或:void example(void);
^^^^无形参
这时如果要在函数中对程序进行处理计算,一般是使用全局变量。
Q&A
Q:那么全局变量是什么意思呢?
A:全局变量,简单点说就是不在任何自定义函数(包括主函数)中申明定义,而是在所有函数之外定义的变量。
比如这个程序中,变量a不在任何自定义函数(包括主函数)中申明定义,这就是一个全局变量。
#include<bits/stdc++.h>
using namespace std;
int a; //在所有自定义函数(包括主函数)之外定义。
int by_myself(void){
return a - 1; //别误会,这只是用到了a,不是在这个函数中定义的。
}
int main(){
a = by_myself(); //调用自定义函数。
return 0;
}
注:程序中有些地方尚未讲解,下面会涉及到。
3 非全局变量(或称局部变量)
非全局变量(或称局部变量)也称为内部变量。局部变量是在函数内作定义申明的。其作用域仅限于定义它的函数内, 离开该函数后再使用这种变量是非法的。
以下看代码理解:
int example(int a){
int b,c;
…… //若干个操作处理语句
}a,b,c作用域
这段代码里的a是形参,可以在这个函数内部调用;b,c是局部变量。
二 传输数值或地址
1 传输数值
上文讲解实参与形参时,是否注意到是实参将自己的值传输给了自定义函数中的形参?这就是从调用函数中的实参传输了一个数值给被调用函数的形参。(这段可能有点拗口,可以多读几遍,一定要搞懂,很重要)
关于实参与形参,上文讲得很清楚了,这里不再赘述。
2 传输地址
先举个例子:
#include <iostream>
using namespace std;
void Add1(int *a) {
(*a) ++;
}
void Add2(int a) {
a ++;
}
int main() {
int x = 1, y = 5;
Add1(&x);
Add2(y);
cout << x << " " << y << endl;
return 0;
}
输出:
2 5
这两个自加函数中,Add1是指针传递,Add2是数值传递.
(以下两段很重要)
在调用 Add1(&x) 时,系统先建造int型指针a,然后将实参x的地址传给了指针a,故此时a与&x是指向同一地址,即共享统一数据,当对地址a内的数据进行操作,就是对x进行操作。a++时自然也对x++,当函数调用结束,指针a释放掉,x的值此时已经发生了变化。
可以说,这种方法就是把两个数据“捆绑”在了一块。
在调用Add2(y)时,系统是先建造一个int型变量a,再将y的值传给a(此时y和a是两个不同地址的变量,只是两者值相同),然后a++,却对y没有任何操作,故在函数调用结束后,释放a,而y没任何变化;
这种方法,主要是为函数内部接下来的运算服务的,对主函数没有影响。
3 对比
这就是两者不同,地址传递的参数是指针类型,数值传递只是单纯地让被调用的函数“知道”一个值。
至于选择那种传递,就要看这个程序的具体目的和功能了,一般要对参数进行修改的要用地址传递,而只是调用参数的数据进行其他计算并不需要修改数据本身宜用数值传递。
总代码
//cpp
#include<bits/stdc++.h>
using namespace std;
int n = 6; //全局变量n,在所有自定义函数(包括主函数)之外定义。
int by_myself(void){ //无形参
return n - 1; //别误会,这只是用到了n,不是在这个函数中定义的。
}
void Add1(int *a) { //地址传输
(*a) ++;
}
void Add2(int a) { // 传输数值
a ++;
}
int main(){
int x = 1, y = 5; //定义局部变量 x, y
n = by_myself(); //调用自定义函数。
Add1(&x);
Add2(y);
cout << n << " " << x << " " << y << endl;
return 0;
}
输出:
5 2 5