C语言基础——用函数实现模块化程序设计

一、定义函数

二、调用函数

三、局部变量和全局变量

四、变量的存储方式和生存期

1.1、定义函数应该包括:
(1)函数的名字
(2)函数的类型
(3)函数的参数的名字和类型
(4)函数的功能

1.2、定义无参函数
类型名 函数名()
{
  函数体
}
例:

void print_star()//函数类型为void 函数名为print_star
{
	prinf("*******\n");//函数的功能是输出一行*号
}

1.2、定义有参函数
类型名 函数名形式参数表列
{
  函数体
}
例:

int max(int x,int y)//两个整型形参x和y
{
	int z;
	z = x > y ? x : y;
	return(z);
}

二、调用函数

2.1、形式参数和实际参数:
  从前面已知:在定义函数时函数名后面括号中的变量名称为“形式参数”(简称形参),在主函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称实参),实际参数可以是常量、变量或表达式,例:

#include <stdio.h>
int max(int x,int y)
{
	int z;
	z = x > y ? x : y;
	return z;
}
int main()
{
	int max(int x,int y);//对max函数进行声明
	int a,b,c;
	scanf("%d,%d",&a,&b);
	c = max(a,b);//调用max函数,将实参a,b传给形参x,y
	printf("max is %d]n",c);
	return 0;
}

2.2、函数调用的过程:
(1)还未出现函数调用时,形参不占内存中的存储单元;发生函数调用时,形参被临时分配内存单元
(2)return语句的返回值类型应与函数类型一致,如max函数为int型,返回值z也应该是int型,如果不一致,以函数类型为准
(3)调用结束,形参单元会被释放,注意:实参单元仍保留并维持原值,没有改变。实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参

三、局部变量和全局变量

3.1、局部变量
(1)在函数内部定义的变量
(2)在复合语句内定义的变量
注意:局部变量只在定义的范围内有效,在定义以外的函数是不能使用这些变量的
3.2、全局变量
定义:在函数之外定义的变量称为全局变量,从定义变量位置开始到本源文件结束都有效
3.3、局部变量与全局变量同名,例:

#include <stdio.h>
int a = 3,b = 5;//a,b是全局变量
int main()
{
	int max(int a,int b);//函数声明,a,b是形参
	int a = 8;//a是局部变量
	printf("max = %d\n",max(a,b));
	return 0;
}

int max(int a,int b)
{
	int c;
	c = a > b ? a : b;
	return c;
}
//输出8

以上例子中可以看出局部变量a屏蔽了全局变量a,即同名时局部变量有效

四、变量的存储方式和生存期

4.1、从作用域来分,变量分为全局变量和局部变量;从**变量值存在的时间(生存期)**来划分,变量的存储方式分为:静态存储方式和动态存储方式
4.1.1、静态存储方式是指在程序运行期间由系统分配固定的存储空间,全局变量全部存放在静态存储区中
4.1.2、动态存储方式是指在程序运行期间根据需要进行动态分配存储空间,如函数的形参
4.2、局部变量的存储类别
4.2.1、自动变量(auto变量
函数中的局部变量,如果不专门声明为static存储类别,都是动态分配存储空间的,数据存储在动态存储区中,因此成为自动变量,关键字auto可省略,如:
int b = 3;等价于auto int b = 3;
4.2.2、静态局部变量(static局部变量
函数调用结束后继续保留原值,不释放占用的存储单元,例:

#include <stdio.h>
int main()
{
	int f(int);
	int a = 2,i;
	for(i = 0;i < 3;i++)
	{
		printf("%d\n",f(a));
	}
	return 0;
}

int f(int a)
{
	auto int b = 0;
	static c = 3;//静态局部变量
	b = b + 1;
	c = c + 1;
	return(a + b + c);
}
//输出7 8 9

4.2.3、寄存器变量(register变量
为提高执行效率,计算机会将使用频繁的局部变量放到寄存器中,这样就不用了去内存中进行存取,因此这类变量叫做寄存器变了,用关键字register作声明。
注意:由上可知,3中局部变量的存储位置是不同的:自动变量存储在动态存储区;静态局部变量存储在静态存储区;寄存器存储在CPU寄存器中

4.3、全局变量的存储类别
4.3.1、在一个文件内扩展全局变量的作用域
  如果全局变量没有在文件开头定义,其作用范围只限于定义处到文件结束,如果想要在定义点之前的函数引用该变量,可以通过关键字extern进行外部变量声明,例:

#include <stdio.h>
int main()
{
	int max();
	extern int A,B;//把全局变量A,B的作用范围扩展到从此处开始
	scanf("%d,%d",&A,&B);
	printf("max is %d\n",max());
	return 0;
}

int A,B;//此处定义全局变量A,B;作用范围是从此处开始到文件结束

int max()
{
	int m;
	m = A > B ? A : B;
	return m;
}

4.3.2、将全局变量的作用域扩展到其他文件
同样通过extern关键字在另一个文件开头处进行扩展,extern关键字执行步骤
   首先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域;如果找不到,再从其他文件中找,如果找到了,就将其作用域扩展到本文件中;如果找不到就会报错。

4.3.3、将外部变量的作用域限制在本文件中
   通过static关键字对全局变量进行声明,使其职能在本文件中呗使用,而不能被其他文件引用,如:static int A;此时即使在别的文件中通过extern A;引用该变量,但仍不能被使用,这种加上static声明、只能用于本文件的外部变量称为静态外部变量
static声明一个变量的作用:
(1)对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在
(2)对全局变量用static声明,则该变量的作用域只限于本文件模块

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值