第 十 二章函数参数12目标掌握函数参数按值传递掌握函数参数按指针传递掌握函数参数为数组类型掌握全局变量和局部变量3按值传递 函数参数在默认 情况下的传值方式 按值传递是赋值过程,当修改了形参的值,不会改变实参的值 4#include "stdio.h"//声明并定义函数 void changeParaValue(int para1){ para1++; printf("函数内形参值为:%d\n",p ara1);}//主函数void main(){ int i; i = 10; printf("调用函数前值为:%d\n",i); changeParaValue(i);//调用函数,i作为实参传入 printf("调用函数后值为:%d\n",i);} 5交换 值功能#include "stdio.h"void swap(int i , int j){ int tmp; tmp = i; i = j; j = tmp;}void main(){ int x,y; x = 1; y = 4; swap(x,y);} 通 过函数使变量的两个值交换是否能够实现我们需要另外的值传递方式6指针作为函数参数 函数的参数可以是简单数据类型,也可以是指针类型。使 用指针类型做函数的参数,实际向函数传递的变量的值是一个地址。 7#include "stdio.h"//定义并声明函数change Value,该函数有一个参数,该参数的类型为指针void changeValue(int p){ (p)++;//对该指针变量 所指向的值进行自增 }void main(){ int a,pi; a = 10; pi = &a; printf("调 用函数前变量值:%d\n",pi); //调用函数,由于该函数的参数为一个指针参数,所以传一个指针变量 changeValue( p); printf("调用函数后变量值:%d\n",pi);} 8#include "stdio.h"//swap函数实现了互 换两个变量的值void swap(int px, int py){ int tmp; tmp = px; px = py ; py = tmp; }void main(){ int m,n,pm,pn; m = 3; n = 1 2; pm = &m; pn = &n; printf("调用函数前变量m=%d,n=%d\n",m,n); swap(pm,pn ); printf("调用函数后变量m=%d,n=%d\n",m,n);} 9数组作为函数参数 数组名包含了数组中第一个元素 的地 址当用数组作为参数时,传递的就是数组中第一个元素的地址我们可以给函数加一个参数,该参数就是用来传递数组长度给函数的 10#incl ude "stdio.h"int getLargest(int arr[],int length){ int max,i; max = arr[0]; for(i = 0 ; i < length ; i++) { if( max < arr[i]) { max = arr[i]; } } return max;}void main(){ int inputArr[10],i,m ax; printf("请输入10个数字。\n"); //通过循环输入10个数字 for(i = 0 ;i < 10 ; i++) { scanf("%d",&inputArr[i]); } //调用getLar gest函数,该函数返回一个数组中的最大值 max = getLargest(inputArr, 10); //输出最大值 pri ntf("最大值为:%d",max);} 11void main(){ int arr[10],arrLength,max; // 调用输入输入函数 arrLength = inputArr(arr); //得到最大值 max = getLargest(arr, arrLength); //输出最大值 printf("最大值为:%d\n",max);} #include "stdio.h" int inputArr(int arr[]){ char in,i; int count = 0 printf("请输入数字。\ n"); for(i = 0 ;i < 10 ; i++) { scanf("%d",&arr[i]); count++; g etchar(); printf("是否继续输入?(y/n)"); scanf("%c",&in); if(in == ''n '' || in == ''N'') { break; //用户停止输入,退出循环 } } return count;//这个cou nt的值就是用户输入的数量 }int getLargest(int arr[],int length){ int max ,i; max = arr[0]; for(i = 0 ; i < length ; i++) { if( max < arr [i]) { max = arr[i]; } } ret urn max;}12局部变量和全局变量局部变量是在函数内部定义的变量,其作用域为它所在的函数内 全局变量是函数外声明的变量。其作 用域为从定义变量的位置开始到程序结束,其它任何函数都能访问。 13变量的作用域限于陆地限于水中限于空中14局部变量15全局变量#i nclude "stdio.h"int gm = 1, gn = 3;//声明两个全局变量gm和gn//声明并定义函数f1,该函数 返回类型为int,有一个int类型参数int f1(int t){int r;r = t + gm;//使用全局变量gmretur n r;}void main(){int x,y;x = 10;y = f1(x) + gn;//使用全局变量gn} 16变量的存 储类型 自动的(auto) 静态的(static) 寄存器(register) 外部的(extern) 17静态的(static) #include "stdio.h"void func(int count){ static int m = 0; int n = 0; m = m + 1; n = n + 1; printf("第%d次调用函数的时候:m = %d,n = %d\n",co unt,m,n);}void main(){ int i; for(i = 0 ; i<10 ; i++) { func(i ); }}18总结在默认情况下,函数是按值传递函数的参数可以是我们在前面学过的简单数据类型,也可以是指针类型。使用指针类 型做函数的参数,实际向函数传递的变量的值是一个地址。函数参数是数组时,实际传递的是数组的首地址。所谓的作用域就是程序中的那些部分可 以访问哪些变量,哪些变量在哪些地方不能被别人访问。局部变量是在函数内部定义的变量,其作用域为它所在的函数内。我们把在函数外声明的变量称为外部变量,外部变量也可以称为全局变量。全局变量的作用域为从定义变量的位置开始到程序结束,其它任何函数都能访问。存储的方法分为两大类:静态存储和动态存储。具体包含四种:自动的(auto),静态的(static),寄存器(register),外部的(extern)。 |
|