Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308606
  • 博文数量: 76
  • 博客积分: 1662
  • 博客等级: 上尉
  • 技术积分: 764
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-25 17:04
个人简介

辛勤的鸟儿总能找到虫子....

文章分类

全部博文(76)

文章存档

2017年(1)

2013年(4)

2012年(5)

2011年(4)

2010年(32)

2009年(23)

2008年(7)

分类: C/C++

2008-11-20 22:21:51

C语言中变量和函数
  今天我想写一下c语言中的变量和函数.其实以前也对这有所了解,但是今天我觉得才真正了解.(如果说的不对或者说的不够有深度请谅解).
  每一个学过c语言的都知道变量和函数的.但是我以前对变量的认识就只有知道它的数据类型.其实在c语言中每一个变量和函数都有两个属性:数据类型和数据的存储类别.在讲这之前,先说说变量的分类.
  根据变量的作用域不同可以将变量分为全局变量和局部变量.
局部变量:在函数内部定义的变量,它只在本函数范围内有效,也就是说只有在函数内才能使用它们,在此函数以外是不能使用这些变量的.这对大家都是很熟悉的,这里就不多说了.
全局变量:程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数.在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量也就是全局变量.注意:1.它的有效范围为从定义变量的位置开始到本源文件结束.例如:
intp=1,q=5; /*外部变量*/
float f1(int a)
{int b,c;
...
}
char c1,c2;  /*外部变量*/
char f2(int x,int y)
{int i,j;
......
}
main()   
{int m,n;
....
}
p,q,c1,c2 都是全局变量,但是它们的作用范围不一样.在main函数和f2函数中可以使用全局变量p,q,c1,c2,但在函数f1中只能使用全局变量p,q,而不能使用c1和c2.
2.全局变量的作用是增加函数之间数据联系的渠道.由于同一个文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道.由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道.例如:
float Max=0,Min=0;
float average(float array[],int n)
{int i;
float aver ,sum=array[0];
Max=Min=array[0];
for(i=1;i
{if (array[i]>Max)Max=array[i];
else if (array[i]
sum=sum+array[i];
}
aver=sum/n;
return(aver);
}
main()
{float ave,score[10];
int i;
for(i=0;i<10;i++)
sacnf("%f",&score[i]);
ave=average(score,10);
printf("max=%6.2f\min=%6.2f\n",Max,Min,ave);
}
运行结果是:
99 45 97 100 67.5 89 92 66 43
max=100.00
min=43.00
aeverage=77.65
3.建议不在必要时不要使用全局变量,理由:
1).全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元.
2).它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量.如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去.但若该外部变量与其它文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性.
3).如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被"屏蔽",即他不起作用.
 根据变量值存在的时间(生存期)可以分为静态存储方式和动态存储方式.
所谓静态存储方式是指在程序运行期间分配固定的存储空间的方式;动态存储方式是指在程序运行期间根据需要动态的分配存储空间的方式.内存中供用户使用的存储空间情况,这个存储空间分为3部分:程序区 静态存储区和动态存储区.
 静态存储区主要存放的是全局变量,在程序开始执行的时候给全局变量分配存储区,程序执行完后就释放.在程序执行过程中它们占据固定的存储单元,而不是 动态的进行分配和释放.
 在动态存储区中存放的主要是:①函数形式参数.在调用函数的时候给行参分配存储空间.②自动变量.③函数调用是的现场保护和返回地址等.这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间.
 根据数据在内存中的存储方式,可分为静态存储方式和动态存储方式,具体包含四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern).下面分别做介绍:
 ⒈auto变量
 函数中的局部变量,如果不做专门声明为static存储类别,都是动态的分配存储空间的.数据存储在动态存储区中.这类变量就是我们经常用到的变量,大家都很熟悉就不多做解释.
 ⒉static声明的变量
 ①用static声明局部变量
有时候希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下次该函数调用时,改变量已有值,就是上一次函数调用结束时的值.这时就应该指定该局部变量为"静态局部变量",用关键字static进行声明.语法是:static 数据类型 变量名;
说明:
 1.静态局部变量属于静态存储类别,在静态存储区内分配存储单元.在程序整个运行期间不释放.而自动变量属于动态存储类别,占动态区空间而不占静态存储区空间,函数调用结束后即释放空间.
 2.对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值.以后每次调用函数是不再重新赋初值而只是保留上一次函数调用结束时的值;对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行的,每调用一次就重新给一次初值,相当于执行一次赋值语句.
 3.如在定义局部变量是不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量).而对自动变量来说,如果不赋初值则它的值是一个不确定的值.
4.虽然静态局部变量在函数调用结束后仍然存在,但是其他函数不能调用它.
例子:
   int fac(in n)
{ static int f=1;
f=f*n;
return (f);
 }
main()
{
int i;
for(i=1;1<=5;i++)
printf("%d! =%d\n",i,fac(i));
}
运行结果:
1!=1;2!=2;3!=6;4!=24;5!=120;
②用static声明全局变量
有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用.这时就可以在定义外部变量时加一个static声明.例
file1.c                   file2.c
static int A;            extern int A;
main()                   fun(int n)
{                           {
                             ...
                                A=A*n;}
}
在file1.c中定义了一个全局变量A;但它用static声明,因此只能在本文件中使用,虽然在file2.c文件中用"extern int A;",但file2.c文件中无法使用file1.c中的全局变量A.
3.register变量
一般情况下,变量的值是存放在内存中的.当程序中用到那一个变量的值时,由控制器发出命令将内存中该变量的值送到运算器中.经过运算器运算后,如果需要寸数,再从运算器将数据送到内存存放.如果有一些变量使用频繁,则为存取变量要花很长的时间,为了提高效率,c语言允许将局部变量的值存放在cpu中的寄存器中,需要时直接从寄存器取出参加运算,不必到内存.这种变量编译系统自动根据使用情况识别,并自动改变.
4.用extern声明外部变量
  如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束.如果在定义之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作"外部变量声明".表示该变量是一个已定义的外部变量.有了此声明,就可以从"声明"处起合法地使用该外部变量.例:
int max(int x,int y)
{int z;
z=x>y? x:y;
return(z);
}
main()
{extern int A,B;
printf("%d",max(A,B));
}
int A=13,B=-8;
结果是:
13
注意:用extern声明外部变量时,类型名可以写也可以省写.例如在上例中的"extern int A;"也可以写成:"extern A;"
  ****写到这里就不得不说说声明和定义的区别了.对于函数来说函数的声明是函数原型,而函数的定义是函数的本身.对函数的声明是放在声明部分中的,而函数的定义是显然不在声明的范围之内,他是一个独立的模块.
对变量来说声明就比较复杂,有二中情况:一种是需要建立存储空间的(int a),另一种是不需要建立存储空间的(extern a).前者称为"定义性声明"或者是定义.后者是引用性声明.广义地说,声明包含定义,但并非所有的声明都是定义.对"int a;"而言它既可以是声明,又是定义.而对"extern a;"而言,它是一个声明不是定义.一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明.*******
二:内部函数和外部函数
函数本质上是全局的,因为一个函数要被另外的函数使用,但是,也可以指定函数不能被其他文件调用.根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数.
 内部函数:如果一个函数只能被本文件中的其他函数所调用,它称为内部函数.在定义时,在函数名和函数类型的前面加static.即
static 类型标识符 函数名(形参表)   例如:
static int fun (int a ,intb)
内部函数又叫做静态函数.使用内部函数,可以使函数只局限于所在文件,如果在不同文件中有同名的内部函数,互不干扰.
  外部函数
⑴在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用.
如函数首部可以写成:
extern int fun(int a,int b)
这样fun函数就可以为其他文件调用.c语言规定:如果在定义函数时省略extern,则隐含为外部函数.
⑵在需要调用此函数的文件中,用extern声明所用的函数是外部函数.
阅读(2312) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chenweiming5072009-05-07 10:20:56

你说的很对

chinaunix网友2009-05-06 11:28:08

不过有点小错 ⒈auto变量  函数中的局部变量,如果不做专门声明为static存储类别 里面应该是AUTO而不是STATIC

chinaunix网友2009-05-06 11:27:15

写的不错!让我有所收获!