数据结构双语素材章_第1页
数据结构双语素材章_第2页
数据结构双语素材章_第3页
数据结构双语素材章_第4页
数据结构双语素材章_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章函数调用

本章要点函数的概念函数的定义与调用函数的递归调用变量的作用域函数的作用域

主要内容7.1函数概述

7.2函数定义的一般形式

7.3函数参数和函数的值

7.4函数的调用

7.5函数的嵌套调用

主要内容7.6函数的递归调用

7.7数组作为函数参数

7.8变量的作用域--局部变量和全局变量

7.9变量的存储方式和生存期

7.10关于变量的声明和定义

7.11内部函数和外部函数7.1函数概述

一个C程序可由一个主函数和若干个其他函数构成。一个较大的程序可分为若干个程序模块,每一个模块用来实现一个特定的功能。在高级语言中用子程序实现模块的功能。子程序由函数来完成。

函数间的调用关系:由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。例7.1函数调用的简单例子#include<stdio.h>voidmain(){voidprintstar();/*对printstar函数声明*/voidprint_message();/*对print_message函数声明*/printstar();/*调用printstar函数*/

print_message();/*调用print_message函数*/printstar();/*调用printstar函数*/}voidprintstar()/*定义printstar函数*/{printf("****************\n");}voidprint_message()/*定义print_message函数*/{printf("Howdoyoudo!\n");}运行情况如下:****************Howdoyoudo!****************

说明:

1.一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对于较大的程序,通常将程序内容分别放在若干个源文件中,再由若干源程序文件组成一个C程序。这样便于分别编写、分别编译,提高调试效率。一个源程序文件可以为多个C程序公用。

说明:

2.一个源程序文件由一个或多个函数以及其他有关内容(如命令行、数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。说明:

3.C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。

说明:

4.所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数。main函数是系统调用的。说明:5.从用户使用的角度看,函数有两种:①

标准函数,即库函数。这是由系统提供的,用户不必自己定义这些函数,可以直接使用它们。不同的C系统提供的库函数的数量和功能会有一些不同,但许多基本的函数是共同的。②用户自己定义的函数。用以解决用户的专门需要。说明:6.从函数的形式看,函数分两类:①无参函数。无参函数一般用来执行指定的一组操作。在调用无参函数时,主调函数不向被调用函数传递数据。②有参函数。主调函数在调用被调用函数时,通过参数向被调用函数传递数据。7.2函数定义的一般形式

7.2.1.为什么要定义函数C语言规定,在程序中用到的所有函数,必须“先定义,后使用”。定义函数包括以下几个内容:⒈指定函数的名字,以便以后按名调用。⒉指定函数的类型,函数值的类型。⒊指定函数的参数的名字和类型,以便在调用函数时向它们传递数据。对无参函数不需要这项。⒋指定函数应当执行什么操作,也就是函数是做什么的,即函数的功能。这是最重要的。7.2函数定义的一般形式

7.2.1.为什么要定义函数

对于C编译系统提供的库函数,是由编译系统事先定义好的,程序设计者不必自已定义,只需#include命令把有关的头文件包含到本文件模块中即可。例如,在程序中若用到数学函数(如sqrt,fabs,sin,cos等),就必须在本文件模块的开头写上:

#include<math.h>7.2函数定义的一般形式7.2.2怎样定义无参函数定义无参函数的一般形式为:类型标识符函数名(){

声明部分

语句部分}7.2函数定义的一般形式7.2.3怎样定义有参函数定义有参函数的一般形式为:类型标识符函数名(形式参数表列){

声明部分

语句部分}例如:intmax(intx,inty){intz;/*函数体中的声明部分*/z=x>y?x∶y;

return(z);}

7.2函数定义的一般形式7.2.4定义空函数定义空函数的一般形式为:类型标识符函数名(){}例如:voiddummy(){}主调函数调用空函数时,只表明这里要调用一个函数,但函数本身什么工作也不做等,以后扩充函数功能时补充上。7.3函数参数和函数的值7.3.1形式参数和实际参数

形式参数:函数名后面括弧中的变量名称为“形式参数”(简称“形参”);实际参数:主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”(简称“实参”);函数返回值:return后面的括弧中的值作为函数带回的值(称函数返回值)。

主调函数和被调用函数之间有数据传递的关系。在不同的函数之间传递数据,可以使用的方法有:参数:通过形式参数和实际参数返回值:用return语句返回计算结果全局变量:外部变量例7.2输入两个整数,要求用一个函数求出其中的大者,并在主函数中输出此值。

#include<stdio.h>voidmain(){intmax(intx,inty);

/*对max函数的声明*/inta,b,c;

scanf("%d,%d",&a,&b);c=max(a,b);

printf("Maxis%d",c);}

intmax(intx,inty)/*定义有参函数max*/{

intz;z=x>y?x∶y;

return(z);}

运行情况如下:7,8↙Max

is

通过函数调用,可使两个函数中的数据发生联系。关于形参与实参的说明:1.

在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。2.

实参可以是常量、变量或表达式,例如:

max(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参。3.在被定义的函数中,必须指定形参的类型。4.实参与形参的类型应相同或赋值兼容。5.

实参向形参的数据传递是单向“值传递”,只能由实参传给形参,而不能由形参传回来给实参。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。7.3函数参数和函数的值7.3.2函数的返回值函数的返回值是通过函数调用使主调函数得到的确定值。例如:例8.2中,max(2,3)的值是3,max(5,2)的值是5。赋值语句将这个函数值赋给变量c。说明:

1.函数的返回值是通过函数中的return语句获得的。一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用。return语句后面的括弧也可以不要例如:

“returnz;”等价于“return(z);”return后面的值可以是一个表达式。例如:

max(intx,inty){

return(x>y?x:y);

}2.函数的返回值应当属于某一个确定的类型,在定义函数时指定函数返回值的类型。例如:下面是3个函数的首行:int

max(floatx,floaty)/*函数值为整型*/char

letter(charc1,charc2)/*函数值为字符型*/

double

min(intx,inty)/*函数值为双精度型

*/

注意:凡不加类型说明的函数,自动按整型处理。3.在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。4.对于不带回值的函数,应当用“void”定义函数为“无类型”(或称“空类型”)。此时在函数体中不得出现return语句。

例7.3返回值类型与函数类型不同#include<stdio.h>voidmain(){intmax(floatx,floaty);

floata,b;

intc;

scanf("%f,%f,",&a,&b);c=max(a,b);

printf("Maxis%d\n",c);}intmax(floatx,floaty){floatz;/*z为实型变量*/

z=x>y?x∶y;

return(z);}运行情况如下:1.5,2.5↙

Maxis2

7.4函数的调用

7.4.1函数调用的一般形式函数调用的一般形式为:

函数名(实参表列)说明:1.如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略。2.如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,向形参传递数据。如果实参表列包括多个实参,对实参求值的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。例如:

printf(″%d,%d″,i,++i);

若i的原值为3,在VC++6.0环境下运行的结果不是“3,4”,而为“4,4”。因为按自右而左顺序,先求++i得4,再向左进行,此时的i已是4了。如果想输出3和4,应写成:

i=3;j=i++;printf(”%d,%d”,i,j);7.4函数的调用7.4.2函数调用的方式1.函数语句把函数调用作为一个语句。这时不要求函数带回值,只要求函数完成一定的操作。2.函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=2*max(a,b);

按函数在程序中出现的位置来分,可以有以下三种函数调用方式:

3.函数参数函数调用作为一个函数的实参。例如:m=max(a,max(b,c));其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参。m的值是a、b、c三者中的最大者。7.4函数的调用

7.4.3对被调用函数的声明和函数原型在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?1.首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。但光有这一条件还不够。3.如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面,应该在主调函数中对被调用的函数作声明。2.如果使用库函数,还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。

例7.4对被调用的函数作声明#include<stdio.h>voidmain(){floatadd(floatx,floaty);

/*对被调用函数add的声明*/

floata,b,c;

scanf("%f,%f",&a,&b);

c=add(a,b);printf("sumis%f\n",c);}floatadd(floatx,floaty)/*函数首部*/{floatz;/*函数体*/z=x+y;

return(z);}运行情况如下:3.6,6.5↙

Sumis10.100000函数原型的一般形式为:1.函数类型函数名(参数类型1,参数类型2……);2.函数类型函数名(参数类型1,参数名1,参数类型2,参数名2……);声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。注意:函数的“定义”和“声明”不是一回事。函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。函数的声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。它不包含函数体。

说明:

(1)如果被调用函数的定义出现在主调函数之前,可以不必加以声明。(2)如果已在文件的开头(在所有函数之前),已对本文件中所调用的函数进行了声明,则在各函数中不必对其所调用的函数再作声明。

例7.5(例7.4的改写)#include<stdio.h>floatadd(floatx,floaty)/*函数首部*/{floatz;

z=x+y;

return(z);}voidmain(){/*不必再对add函数作声明*/ floata,b,c;

scanf("%f,%f",&a,&b);

c=add(a,b);printf("sumis%f\n",c);}

7.5函数的嵌套调用嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数的完整定义。在主函数中调用一个max_4函数来求4个整数中的最大数。然后在max_4函数中再调用一个max_2函数来求2个整数中的最大数。最后在主函数中输出结果。方法:例7.6输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。#include<stdio.h>voidmain(){intmax_4(inta,intb,intc,intd);/*max_4函数的声明*/inta,b,c,d,max;printf("Pleaseenter4intergernumbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max_4(a,b,c,d);/*调用max_4函数*/printf("max=%d\n",max);}intmax_4(inta,intb,intc,intd)/*max_4函数的定义*/{intmax_2(int,int);/*max_2函数的声明*/intm;

m=max_2(a,b);/*调用max_2函数*/m=max_2(m,c);/*调用max_2函数*/m=max_2(m,d);/*调用max_2函数*/return(m);/*函数返回值是4个数中的最大者*/}intmax_2(a,b)/*max_4函数的定义*/intmax_2(a,b){if(a>b)returna;elsereturnb;/*函数返回值是a和b中的大者*/}运行情况如下:Pleaseenter4intergernumbers:1145–540↙max=457.6函数的递归调用

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。例如:

intf(intx){inty,z;z=f(y);/*在执行f函数的过程中又要调用f函数*/return(2*z);}例7.7:

有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大。age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10可以用数学公式表述如下:age(n)=10(n=1)age(n-1)+2(n>1)可以用一个函数来描述上述递归过程:intage(intn)/*求年龄的递归函数*/

{intc;/*c用作存放函数的返回值的变量*/

if(n==1)c=10;

elsec=age(n-1)+2;

return(c);}运行结果如下:18用一个主函数调用age函数,求得第5人的年龄。#include<stdio.h>voidmain(){printf(″%d″,age(5));}例7.8用递归方法求n!

求n!也可以用递归方法,即5!等于4!×5,而4!=3!×4…1!=1。可用下面的递归公式表示:n!︳

=1(n=0,1)

︳=n·(n-1)!(n>1)程序如下:

#include<stdio.h>voidmain(){longfac(intn);/*对fac函数的声明*/intn;longy;printf("inputanintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%ld\n",n,y);}longfac(intn)/*定义fac函数*/{longf;if(n<0) printf("n<0,dataerror!");elseif(n==0,n==1) f=1;elsef=fac(n-1)*n;return(f);}运行情况如下:inputanintegernunber:10↙

10!=3628800例7.9Hanoi(汉诺塔)问题:由上面的分析可知:将n个盘子从A座移到C座可以分解为以下3个步骤:1.将A上n-1个盘借助C座先移到B座上。2.把A座上剩下的一个盘移到C座上。3.将n-1个盘从B座借助于A座移到C座上。程序如下:#include<stdio.h>voidmain(){voidhanoi(intn,charone,chartwo,charthree);

/*对hanoi函数的声明*/intm;printf("inputthenumberofdiskes:");scanf(“%d”,&m);printf("Thesteptomoveing%ddiskes:\n",m);hanoi(m,'A','B','C');}voidhanoi(intn,charone,chartwo,charthree)

/*定义hanoi函数,将n个盘从one座借助two座,移到three座*/{voidmove(charx,chary);/*对move函数的声明*/if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}voidmove(charx,chary)/*定义move函数*/{printf(“%c-->%c\n",x,y);}运行情况如下:inputthenumberofdiskes:3↙

Thestepstonoving3diskes:

A-->CA-->BC-->BA-->CB-->AB-->CA-->C

7.7数组作为函数参数7.7.1数组元素作函数实参

由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参,与用变量作实参一样,是单向传递,即“值传送”方式。例7.10

有两个数组a和b,各有10个元素,将它们对应地逐个相比(即a[0]与b[0]比,a[1]与b[1]比……)。如果a数组中的元素大于b数组中的相应元素的数目多于b数组中元素大于a数组中相应元素的数目(例如,a[i]>b[i]6次,b[i]>a[i]3次,其中i每次为不同的值),则认为a数组大于b数组,并分别统计出两个数组相应元素大于、等于、小于的次数。#include<stdio.h>voidmain(){intlarge(intx,inty);/*函数声明*/inta[10],b[10],i,n=0,m=0,k=0;

printf(″enterarraya∶\n″);

for(i=0;i<10;i++=)scanf(″%d″,&a[i]);

printf(″\n″);

printf(″enterarrayb∶\n″);

for(i=0;i<10;i++=)scanf(″%d″,&b[i]);

printf(″\n″);

for(i=0;i<10;i++)

{if(large(a[i],b[i])==1)n=n+1;

elseif(large(a[i],b[i])==0)m=m+1;

elsek=k+1;}printf("a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]<b[i]%dtimes\n",n,m,k);if(n>k)printf("arrayaislargerthanarrayb\n");elseif(n<k)printf("arrayaissmallerthanarrayb\n");

elseprintf("arrayaisequaltoarrayb\n");}large(intx,inty){intflag;

if(x>y)flag=1;

elseif(x<y)flag=-1;

elseflag=0;

return(flag);}运行情况如下:

enterarraya:

1357986420↙

enterarrayb∶

5389–1–35604↙

a[i]>b[i]4timesa[i]=b[i]1timesa[i]<b[i]5times

arrayaissmallerthannarrayb7.7数组作为函数参数7.7.2数组名作函数参数

可以用数组名作函数参数,此时形参应当用数组名或用指针变量。例7.11有一个一维数组score,内放10个学生成绩,求平均成绩。#include<stdio.h>voidmain(){floataverage(floatarray[10]);/*函数声明*/floatscore[10],aver;

inti;

printf(″input10scores:\n″);

for(i=0;i<10;i++=

scanf(″%f″,&score[i]);

printf(″\n″);

aver=average(score);

printf(″averagescoreis%5.2f\n″,aver);}floataverage(floatarray[10]){inti;

floataver,sum=array[0];

for(i=1;i<10;i++=)sum=sum+array[i];aver=sum/10;

return(aver);}运行情况如下:input10scores:

100567898.576879967.57597↙

averagescoreis83.40

例7.12编写一个函数,用来分别求数组score_1和数组score_2各元素的平均值。

#include<stdio.h>voidmain(){floataverage(floatarray[],intn)

floatscore_1[5]={98.5,97,91.5,60,55};

floatscore_2[10]={67.5,89.5,99,69.5,

77,89.5,76.5,54,60,99.5};

printf(“theaverageofclassAis%6.2f\n”,

average(score_1,5));printf(“theaverageofclassBis%6.2f\n”,

average(score_2,10));

}floataverage(floatarray[],intn){inti;

floataver,sum=array[0];

for(i=1;i<n;i++=

sum=sum+array[i];

aver=sum/n;

return(aver);}运行结果如下:theaverageofclassAis80.40TheaverageofclassBis78.20例7.13用选择法对数组中10个整数按由小到大排序。所谓选择法就是先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。未排序时的情况:a[0]a[1]a[2]a[3]a[4]36194将5个数中最小的数1与a[0]对换:16394将余下的4个数中最小的数3与a[1]对换

13694将余下的3个数中最小的数4与a[2]对换

13496将余下的2个数中最小的数6与a[3]对换,至此完成排序

13469程序实例#include<stdio.h>voidmain(){voidsort(intarray[],intn);inta[10],i;

printf(″enterthearray\n″);

for(i=0;i<10;i++=

scanf(″%d″,&a[i]);

sort(a,10);

printf(″thesortedarray∶\n″);

for(i=0;i<10;i++=

printf(″%d″,a[i]);

printf(″\n″);}voidsort(intarray[],intn){inti,j,k,t;

for(i=0;i<n-1;i++){k=i;

for(j=i+1;j<n;j++)

if(array[j]<array[k]=k=j;t=array[k];

array[k]=array[i];array[i]=t

}}运行结果如下:enterarray:57–321–436732133510↙Thesortedarray:–43–3057213351673217.7数组作为函数参数7.7.3用多维数组名作函数参数

多维数组元素可以作函数参数,这点与用一维数组元素作函数参数的情况类似。也可以用多维数组名作为函数的实参和形参,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。例7.14有一个3×4的二维数组,设计一个函数,用来求二维数组中所有元素中的最大值。程序如下:#include<stdio.h>voidmain(){max_value(intarray[][4]);int[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};

printf(″maxvalueis%d\n″,

max_value(a));}

算法:先使变量max的初值为二维数组中第一个元素的值,然后将二维数组中各个元素的值与max相比,每次比较后都把“大者”存放在max中,全部元素比较完后,max的值就是所有元素的最大值。max_value(intarray[][4]){inti,j,k,max;

max=array[0][0];

for(i=0;i<3;i++)

for(j=0;j<4;j++=

if(array[i][j]>max)

max=array[i][j];

return(max);}

运行结果如下:Maxvalueis347.8变量的作用域--局部变量和全局变量7.8.1局部变量

在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。floatf1(inta)/*函数f1*/{intb,c;…a、b、c有效}charf2(intx,inty)/*函数f2*/{inti,j;x、y、i、j有效}voidmain()/*主函数*/{intm,n;…m、n有效}

主函数中定义的变量只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。(2)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。(3)形式参数也是局部变量。(4)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。voidmain(){inta,b;…{intc;c=a+b;c在此范围内有效a,b在此范围内有效

…}…}

7.8变量的作用域--局部变量和全局变量7.8.2全局变量在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。intp=1,q=5;/*外部变量*/floatf1(inta)/*定义函数f1*/{intb,c;…}charc1,c2;/*外部变量*/charf2(intx,inty)/*定义函数f2*/{inti,j;全局变量p,q的作用范围

…全局变量c1,c2的作用范围}voidmain()/*主函数*/{intm,n;…}

例7.15有一个一维数组,内放10个学生成绩,写一个函数,求出平均分、最高分和最低分。#include<stdio.h>floatMax=0,Min=0;/*全局变量*/voidmain(){floataverage(floatarray[],intn);floatave,score[10];

inti;

for(i=0;i<10;i++)

scanf(″%f″,&score[i]);

ave=average(score,10);

printf(“max=%6.2f\nmin=%6.2f\naverage=%6.2f\n“,Max,Min,ave);

}floataverage(floatarray[],intn)

/*定义函数,形参为数组*/{inti;

floataver,sum=array[0];

Max=Min=array[0];

for(i=1;i<n;i++){if(array[i]>Max)Max=array[i];

elseif(array[i]<Min)Min=array[i];

sum=sum+array[i];}

aver=sum/n;

return(aver);}运行情况如下:9945789710067.589926643↙max=100.00min=43.00average=77.65

建议不在必要时不要使用全局变量,原因如下:①全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。②使用全局变量过多,会降低程序的清晰性。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。③它降低函数的通用性,因为函数在执行时要依赖于其所在的外部变量。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。一般要求把C程序中的函数做成一个封闭体,除了可以通过“实参——形参”的渠道与外界发生联系外,没有其他渠道。例7.16外部变量与局部变量同名#include<stdio.h>inta=3,b=5;/*a,b为外部变量*/a,b作用范围voidmain(){inta=8;/*a为局部变量*/局部变量a作用范围

printf(″%d″,max(a,b));全局变量b的作用范围

}max(inta,intb)/*a,b为局部变量*/

{intc;c=a>b?a∶b;形参a、b作用范围

return(c);

}运行结果为

8

7.9变量的存储方式和生存期

从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从变量值的生存期(即存在的时间)角度来分,又可以分为静态存储方式和动态存储方式。

7.9变量的存储方式和生存期

所谓静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。这个存储空间可以分为三部分:

1.程序区2.静态存储区3.动态存储区在C语言中每一个变量和函数有两个属性:数据类型和数据的存储类别。7.9变量的存储方式和生存期7.9.1局部变量的存储类别1.auto变量:函数中的局部变量,如不专门声明st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论