函数(二)

一、数组作为函数参数

1.数组元素作函数实参

数组元素可以用作函数实参,但不能用作形参
在用数组元素作函数实参时,把实参的值传给形参

数据传递方向:
从实参传到形参,单向传递

2.一维数组名做函数参数

数组名也可以作实参和形参,传递的是数组第一个元素的地址
数组名就是数组首元素的地址

补充:

  1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
  2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
  1. 用数组名作函数参数,应该在主调函数和被调用函数分别定义数组
  2. 实参数组与形参数组类型应一致
  3. 形参数组名获得了实参数组的首元素的地址,数组名代表数组的首元素地址。

形参数组首元素和实参数组首元素具有同一地址,它们共占同一存储单元

  1. 形参数组可以不指定大小,在定义数组时在数组名后面跟一个空的方括号([ ])

例如:有一个一维数组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. 在函数内的复合语句内定义
  3. 在函数的外部定义

1.局部变量

在某个函数或块的内部声明的变量

局部变量保存在栈中,只在所在函数被调用时才动态地为变量分配存储单元

它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可用的

  1. 主函数中定义的变量只在主函数中有效

主函数也不能使用其他函数中定义的变量

  1. 不同函数中可以使用同名的变量,代表不同的对象,互不干扰
  2. 形式参数也是局部变量
  3. 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效

这种复合语句也称为“分程序”或“程序块”

2.全局变量

定义在函数外部,通常是在程序的顶部

全局变量保存在内存的全局存储区中,占用静态的存储单元

全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。

全局变量可以被任何函数访问。全局变量在声明后整个程序中都是可用的

全局变量的作用是增加了函数间数据联系的渠道

如果在一个函数中改变了全局变量的值,就能影响到其它函数中全局变量的值。
利用全局变量可以通过函数调用得到一个以上的值

三、变量的存储方式

1.动态存储方式与静态存储方式

静态存储方式:程序运行期间由系统分配固定的存储空间方式
动态存储方式:在程序运行期间根据需要进行动态的分配存储空间方式

内存中供用户使用的存储空间:

  1. 程序区
  2. 静态存储区
  3. 动态存储区

全局变量全部放在静态存储区中,程序开始执行时给全局变量分配存储区,程序执行完毕就释放

在动态存储区中存放:

  1. 函数形式参数,在调用函数时给形参分配存储空间
  2. 函数中定义没有staric声明,就是自动变量
  3. 函数调用时的现场保护和返回地址

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声明一个变量的作用是:

  1. 对局部变量用static声明,把他分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在。
  2. 对全局变量用static声明,则该变量的作用域只限于本文件模块(被声明的文件中)

用auto,register和static声明变量时,是在定义变量的基础上加上,不能单独使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值