函数(二)
一、数组作为函数参数
1.数组元素作函数实参
数组元素可以用作函数实参,但不能用作形参
在用数组元素作函数实参时,把实参的值传给形参
数据传递方向:
从实参传到形参,单向传递
2.一维数组名做函数参数
数组名也可以作实参和形参,传递的是数组第一个元素的地址
数组名就是数组首元素的地址
补充:
- sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
- &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
- 用数组名作函数参数,应该在主调函数和被调用函数分别定义数组
- 实参数组与形参数组类型应一致
- 形参数组名获得了实参数组的首元素的地址,数组名代表数组的首元素地址。
形参数组首元素和实参数组首元素具有同一地址,它们共占同一存储单元
- 形参数组可以不指定大小,在定义数组时在数组名后面跟一个空的方括号([ ])
例如:有一个一维数组score,内放10个学生成绩,求平均成绩
#include<stdio.h>//头文件
int main()
{
float average(float array[10]);
float score[10], aver;
int i;
printf("input 10 scores:\n");
for (i = 0; i < 10; i++)
{
scanf("%f", &score[i]);
}
printf("\n");
aver = average(score);
printf("average score is %5.2f\n", aver);
return 0;
}
float average(float array[10])
{
int i;
float aver, sum = array[0];
for (i = 1; i < 10; i++)
{
sum = sum + array[i];
}
aver = sum / 10;
return aver;
}
结果:
输入10个成绩:
100 56 78 98 67.5 99 54 88.5 76 58
平均分数为: 77.50
3.多维数组名作函数参数
可以用多维数组名作为函数的实参和形参,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。
不能省略第2维以及其他高维的大小说明
二、局部变量和全局变量
定义变量的三种情况:
- 在函数的开头定义
- 在函数内的复合语句内定义
- 在函数的外部定义
1.局部变量
在某个函数或块的内部声明的变量
局部变量保存在栈中,只在所在函数被调用时才动态地为变量分配存储单元
它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可用的
- 主函数中定义的变量只在主函数中有效
主函数也不能使用其他函数中定义的变量
- 不同函数中可以使用同名的变量,代表不同的对象,互不干扰
- 形式参数也是局部变量
- 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效
这种复合语句也称为“分程序”或“程序块”
2.全局变量
定义在函数外部,通常是在程序的顶部
全局变量保存在内存的全局存储区中,占用静态的存储单元
全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。
全局变量可以被任何函数访问。全局变量在声明后整个程序中都是可用的
全局变量的作用是增加了函数间数据联系的渠道
如果在一个函数中改变了全局变量的值,就能影响到其它函数中全局变量的值。
利用全局变量可以通过函数调用得到一个以上的值
三、变量的存储方式
1.动态存储方式与静态存储方式
静态存储方式:程序运行期间由系统分配固定的存储空间方式
动态存储方式:在程序运行期间根据需要进行动态的分配存储空间方式
内存中供用户使用的存储空间:
- 程序区
- 静态存储区
- 动态存储区
全局变量全部放在静态存储区中,程序开始执行时给全局变量分配存储区,程序执行完毕就释放
在动态存储区中存放:
- 函数形式参数,在调用函数时给形参分配存储空间
- 函数中定义没有staric声明,就是自动变量
- 函数调用时的现场保护和返回地址
2.自动变量(auto变量)
函数中定义没有staric声明,就是自动变量
函数调用开始时分配动态存储空间,函数结束时释放空间
关键字auto可以省略,属于动态存储方式
例如:int b,c = 3;与auto int b,c = 3;等价
3.静态局部变量(static局部变量)
函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放
在下一次在调用该函数时,该变量已有值(就是上一次函数调用结束时的值)
4.寄存器变量(register变量)
将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去取
自动变量存储在动态存储区,静态局部变量存储在静态存储区,寄存器存储在CPU中的寄存器中
5.外部变量声明(extern)
用extern声明外部变量时,类型名可以写也可以省写
例如:extern int A,B,C;等于extern A,B,C;
用extern声明外部变量,扩展外部变量在程序文件中的作用域
一个程序可以由一个或多个源程序文件组成
- 对于局部变量:声明存储类型的作用是指定变量存储的区域(静态存储区或动态存储区)以及由此产生的生存期的问题
- 对于全局变量:由于都是在编译时分配内存的,都存放在静态存储区,声明存储类型的作用是变量作用域的扩展问题
用static声明一个变量的作用是:
- 对局部变量用static声明,把他分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在。
- 对全局变量用static声明,则该变量的作用域只限于本文件模块(被声明的文件中)
用auto,register和static声明变量时,是在定义变量的基础上加上,不能单独使用