通过一个实例理解C语言中“函数”“变量”
学习对象:C语言中的‘函数’和‘变量’
学习目标:对‘函数’和‘变量’有一个较为深刻的理解
学习时间:2020/12/18
代码:
#include<stdio.h>
#include"average.h"
float Max=0,Min=0;
int main()
{
float ave,score[10];
int i;
printf("请输入10个数\n");
for(i=0;i<sizeof score/sizeof score[0];i++){
scanf("%f",&score[i]);
}
ave=average(score,sizeof score/sizeof score[0]);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);
sort(score,sizeof score/sizeof score[0]);
printf("升序排列数为:\n");
for(i=0;i<sizeof score/sizeof score[0];i++){
printf("%.2f\n",score[i]);
}
return 0;
} //file average
float average(float array[],float n)
{ int i;
float sum=array[0],aver;
extern float Max;
extern float Min;
Max=Min=array[0];
for(i=1;i<n;i++){
if(array[i]<Min){
Min=array[i];
}else if(array[i]>Max){
Max=array[i];
}
sum+=array[i];
}
aver=sum/n;
return (aver);
} //average 1
#include"average.h"
void sort(float array[],float n)
{
int i,j,k;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(array[j]<array[k]){
k=j;
}
}
swap(&array[k],&array[i]);
}
} //average 2
void swap(float *ex1,float *ex2)
{ float mid;
mid=*ex1;
*ex1=*ex2;
*ex2=mid; //average3
}
float average(float array[],float n);
void sort(float array[],float n);
void swap(float *ex1,float *ex2); //average.h
学习心得
1,用数组名作函数参数,应该在主调函数和被调用函数分别定义数组,例如在上面的代码中,array是形参数组名,score是实参数组名,分别在其所在的函数中定义,不能只定义一方。
2,实参数组与形参数组类型应一致(上面代码都是float型,便于输入时附带小数),如果不一致,结果会报错。(血的教训)!
3,在定义array函数时,声明数组的大小是没有任何作用的,因为C语言编译系统并不检查形参数组大小,只是将实参数组的首元素的地址传给形参数组名。因此形参数组获得了实参数组的首元素的地址,而数组名代表数组的首元素的地址,因此,形参数组首元素(array[0])和实参数组首元素(score[0])具有相同的地址,它们共同占有一储存单元,score[n]和array[n]指的是同一个单元。score[n]和array[n]具有相同的值。而且,形参数组中各元素的值发生变化也会使实参数组元素的值同时发生变化。
这里给大家附张图。
局部变量和全局变量
1,局部变量:
(a)在一个函数内部定义的变量只在本函数范围内有效,也就是说只有在本函数内才能引用它们,在此函数外是不能使用这些变量的。
(b)在复合语句内定义的变量只在本复合语句范围内有效,只有在本复合语句中才能使用它们。
这里就可以很直观的看都局部变量的有效范围。另外需要注意的是形式参数也是局部变量。在不同的函数中定义了同名的变量也互不影响,它们在内存中占据不同的单元,互不混淆。在复合语句中的变量,离开该复合语句该变量就无效,系统会把它占用的内存单元释放。
2,全局变量
在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
在一个函数中,既可以使用本函数中的局部变量,也可以使用有效的全局变量。例如:
设置全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变全局变量的值,就能影响到其他函数中的全局变量。相当于各个函数之间有直接的通道,通过函数调用能够得到一个以上的值。如果在同一个源文件中,全局变量与局部变量同名,这时会出现什么情况呢?
#include<stdio.h>
int a=3,b=5;
int main()
{
int max(int a,int b);
int a=8;
printf("max=%d\n",max(a,b));
return 0;
}
int max(int a,int b)
{
return(a>b?a:b) ;
}
大家可以看到的结果是
这就非常阿妹京(amazing)了,故意重复使用a和b作变量名,程序第二行定义了全局变量a和b,并且初始化。第六行再次定义a并且复制8。局部变量的作用范围为第6~8行。在此范围内全局变量a被局部变量a屏蔽,相当于全局变量a在此范围内不存在(即全局变量a在此范围内不起作用),而全局变量b在此范围内有效。因此第6行中max(a,b)的实参a应是局部变量,所以max(a,b)相当于max(8,5)。它的值是8。
但是全局是有弊端的,因为在执行一个文件中的操作时,可能会改变该全局变量的值,会影响到另一个文件中全局变量的值,从而影响该文件中函数的执行结果。1,全局变量在程序的全部执行过程中都占用储存单元,而不是仅仅在需要的时候才开辟单元2,它使函数的通用性降低了,因为如果在函数中引用了全局变量,那么执行情况会受到有关的外部变量的影响,如果将一个函数移到另一个文件中,还要考虑把有关的外部变量及其值一起移过去。但是若该外部变量与其他文件的变量同名时,就会出现问题。这就降低了程序的可靠性和通用性。在程序设计中,在划分模块时要求模块的“内聚性”强、与其他模块的“耦合性”弱。即模块的功能要单一(不要把许多互不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而用全局变量是不符合这个原则的。一般要求把C程序中的函数做成一个相对的封闭体,除了可以通过“实参—形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强3,使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。由于在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。