C语言学习系列十九——局部和全局变量

本文深入探讨了局部变量与全局变量的区别,包括它们在函数内外的定义与使用,以及变量的生存周期。通过实例,解释了自动变量、静态变量的概念,并对比了不同类型的变量在程序运行过程中的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

局部变量

保证了函数的独立性

  • 定义在函数内部的变量
  • 还允许定义作用再复合语句中的局部变量
  • 一般定义在函数或复合语句开头处

全局变量

  • 定义在函数外而不属于任何函数的变量
  • 一般定义在函数的最前面
  • 但局部变量和全局变量重名时,在函数内部以局部变量为准
例5-7
#include<stdio.h>
int x;
int f();
int main()
{
	int a=1;
		
	x=a;		//全局变量x 
	a=f();
	{
		int b=2;
		b=a+b;		//局部变量运算 
		x=x+b;		//全局变量运算 
			
	}
	printf("%d %d ",a,x);
		
	return 0;
}

int f()
{
	int x=4;		//x为局部变量 
	
	return x;
}
4 7
例5-8
#include<stdio.h>
float cash;
void income(float number),expend(float number);
int main()
{
	int choice;
	float value;
	
	cash=0;
	printf("Enter (0-end,1-income,2-expend):");
	scanf("%d",&choice);
	while(choice!=0){
		
		if(choice==1||choice==2){
			printf("Enter cash value:" );
			scanf("%f",&value);
			if(choice==1)
			  income(value);
			else
			  expend(value);
			printf("current cash:%.2f\n",cash);
			
		}
		printf("Enter (0-end,1-income,2-expend):");
		scanf("%d",&choice);
		
	}
	
	return 0;
 } 
 
 void income(float number) 
 {
 	cash=cash+number;
 }
 
 void expend(float number)
 {
 	cash=cash-number; 
 }
Enter (0-end,1-income,2-expend):1
Enter cash value:1000
current cash:1000.00
Enter (0-end,1-income,2-expend):2
Enter cash value:456
current cash:544.00
Enter (0-end,1-income,2-expend):0

变量生存周期

变量从定义开始分配储存单元,到运行结束存储单元被回收

根据这种特性,局部变量又称为自动变量

例如:auto int x,y;   auto可以省略。

变量存储的内存分布

动态存储区是是使用堆栈来管理的

静态变量

存放在静态存储区,它的生命周期会持续到程序结束。

stastic     类型名     变量表

例5-9
#include<stdio.h>
double fact_s(int n);
int main()
{
	int i,n;
	printf("Input n: ");
	scanf("%d",&n);
	
	for(i=1; i<=n; i++)
	printf("%3d!=%.0f\n",i,fact_s(i));
	
	return 0;
	
 } 
 double fact_s(int n)
 {
 	static double f=1;			//定义静态变量 
 	f=f*n;						//调用上次的值再乘以n 
 	
 	return (f);
 	
 }
Input n: 6
  1!=1
  2!=2
  3!=6
  4!=24
  5!=120
  6!=720
练习5-2
//将f定义成全局变量可以实现n!
#include<stdio.h>
int f=1;
double fact_s(int n);
int main()
{
	int i,n;
	
	printf("Input n: ");
	scanf("%d",&n);
	
	for(i=1; i<=n; i++)
	printf("%3d!=%.0f\n",i,fact_s(i));
	
	return 0;
	
 } 
 double fact_s(int n)
 {
 			
 	f=f*n;					
 	
 	return (f);
 	
 }

Input n: 6
  1!=1
  2!=2
  3!=6
  4!=24
  5!=120
  6!=720

//把f换成普通局部变量不能实现n!,因为它不能像静态局部变量一样调用上一次的函数值
#include<stdio.h>
double fact_s(int n);
int main()
{
	int i,n;
	printf("Input n: ");
	scanf("%d",&n);
	
	for(i=1; i<=n; i++)
	printf("%3d!=%.0f\n",i,fact_s(i));
	
	return 0;
	
 } 
 double fact_s(int n)
 {
 	int f=1;			
 	f=f*n;						 
 	return (f);
 	
 }

Input n: 6
  1!=1
  2!=2
  3!=3
  4!=4
  5!=5
  6!=6

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值