第十六课 函数参数
目 标
01、理解形式参数与实际参数。
02、 理解参数传递的三种方式。
函数的参数
参数是函数与函数之间实现通信的数据“接口”。函数调用的过程就是调用者带着实际参数(如果有)执行函数,将实际参数“传递”给形式参数,执行完函数体后再将计算得到的返回值传递给调用者(如果有)。
在未调用函数前,函数中的形式参数并不分配内存空间。只有在被调用执行时,才被分配临时存储空间。函数调用结束后,形式参数的内存空间将被操作系统立刻收回。
函数的参数
实际参数可以是任何符合形式参数类型的常量、变量、表达式。函数参数传递的过程就是实际参数和形式参数相结合的过程,必须遵守三个一致。
(1) 个数一致。
(2) 顺序一致。
(3) 类型一致。
例1、打印字符三角形
【问题描述】
编写一个函数 print (n,ch),表示打印一行 n 个英文字母 ch,并换行。然后,在函数 main() 中输入 n 和 ch,调用函数 print() 打印一个字符三角形。
【输入格式】
一行一个整数 n 和一个英文字母 ch,之间用一个空格隔开,1≤n≤20。
【输出格式】
n 行,第 i 行有 i 个字母 ch。
【输入样例】
3 a
【输出样例】
a
aa
aaa
#include
using namespace std;
void print(int i,char ch){
for(int j = 1; j <= i; j++) cout << ch;
cout << endl;
}
int main(){
int n;
char ch;
cin >> n >> ch;
for(int i = 1; i <= n; i++) print(i,ch);
return 0;
}
函数参数的传递方式
根据不同的应用需求,函数参数的传递方式,或者说函数参数的调用方式分为三种:
(1) 传值(调用):参见例2;
(2) 传址(调用):参见例3;
(3) 引用(调用):参见例4、例5;
例2、阅读程序,写出程序的运行结果,体会函数的传值(调用)。
#include
using namespace std;
void swap(int x,int y){
int temp;
temp = x;
x = y;
y = temp;
cout << x << “ “ << y << endl;
}
int main(){
int a = 10,b = 50;
swap(a,b);
cout << a << “ “ << b << endl;
return 0;
}
例3、阅读程序,写出程序的运行结果,体会函数的传址(调用)。
#include
using namespace std;
void swap(int *x,int *y){// 形式参数的类型定义为指针
int temp;
temp = *x;
*x = *y;
*y = temp;
cout << *x << “ “ << *y << endl;
}
int main(){
int a = 10,b = 50;
swap(&a,&b);// 实际参数必须是地址
cout << a << “ “ << b << endl;
return 0 ;
}
例4、阅读程序,写出程序的运行结果,体会变量及其引用的操作。
//#include
using namespace std;
int main(){
int k = 32;
int& k_adr = k;
cout << “ k= ” << k << “ k_adr= ” << k_adr << endl;
k++;
cout << “ k= ” << k << “ k_adr= ” << k_adr < k_adr = -5;
cout << “ k= ” << k << “ k_adr= ” << k_adr << endl;
int i = 100;
k_adr += i;
cout << “ k= ” << k << “ k_adr= ” << k_adr << endl;
return 0;
}
例5、阅读程序,写出程序的运行结果,体会函数的引用调用。
#include
using namespace std;
void swap(int &a,int &b){
int temp;
temp = a;
a = b;
b = temp;
cout << a << “ “ << b << endl;
}
int main(){
int a = 10,b = 50;
swap(a,b);
cout << a << “ “ << b << endl;
return 0;
}
变量的作用域
学习目标
1. 理解变量的作用域。
2. 熟练规范使用局部变量和全局变量。
变量的作用域
变量按其在程序中的作用范围,分为全局变量和局部变量。
全局变量是指定义在任何函数之外的变量,也就是不被任何“{函数体}”所包含,可以被源文件中其他函数所共用,用静态数据区存储,作用域(有效范围)是从定义变量的位置开始到源文件(整个程序)结束。
局部变量是指在一个函数(包括 main 函数)内部定义的变量,它只在本函数内部有效,其他函数不能使用这些变量,用动态数据区存储,函数的参数也是局部变量。
例1、以下程序中,哪些是全局变量,哪些是局部变量,并指出它们的作用域。
int x,y;
float a,b;
float find(int c,d){
float e,f;
int i,j;
…
}
int z;
void doit(){
…
}
int main(){
int g,h;
…
}
例2、找出程序中的错误。如果去掉错误,程序输出什么。
#include
using namespace std;
int f(){
int b = 0,c = 1;
b = b + 1;
c = c + 1;
return (b+c);
}
int main(){
for(int i = 1; i < 4; i++)
cout << i << “ .sum= ” << f() << endl;
cout << “ b= ” << b << “ c= ” << c << endl;
return 0;
}
C++允许在更多地方定义变量,例如for的第一个子句,if、for或者while语句块的{ }内。这些变量只在当前语句块内有效。一个语句块内只能定义一个同名变量。不同的函数内部可以使用相同名称的变量,它们代表不同的对象,相互独立,互不干扰。访问同名变量时、只能访问到当前有效、且最近定义的该变量。特别地,在变量前加“::”可以指定访问全局变量。在写复杂代码时,可以利用这些特性,调整临时变量的定义位置和作用域,以规避变量重名带来的编译错误。
例3、找出程序中的错误。如果去掉错误,程序输出什么。
#include
using namespace std;
int x = 233;
int main(){
int x;
cin >> x;
for(int i = 1; i <= x; ++i){
int x,y;
cin >> x >> y;
cout << x + y << endl;
}
cout << x << endl;
cout << ::x << endl;
cout << i << “ “ << y << endl;
return 0;
}
例4、阅读程序,写出程序的运行结果。
//p6-4-4
#include
using namespace std;
int x = 10, y = 15;
void change(int a, int b, int x){
int temp;
x++;y++;
temp = a;a = b;b = temp;
}
int main(){
int a = 3, b = 5;
cout << x << “ ” << y << “ ” << a << “ ” << b << endl;
change(a,b,x);
cout << x << “ ” << y << “ ” << a << “ ” << b << endl;
return 0;
}