C语言--函数变量的作用范围

79 阅读3分钟

在C语言中,变量的作用域定义了变量在程序中的可访问范围。根据作用域的不同,变量可以分为局部变量和全局变量。

1.局部变量

局部变量是在函数或代码块内部声明的变量,它们只能在该函数或代码块内部被访问。例如,在main函数内部定义的变量a、b和c只能在main函数内部使用,一旦超出这个范围,这些变量就不再有效。同样的规则适用于if、else、while、do while、for和switch等结构化语句内部定义的变量。

错误代码

#include<stdio.h>
//局部变量 
void a(){
	int b=1;
	printf("%d \n",b);
} 

int main(){
	a();
	
	printf("%d",b);
}
会报错,在函数main()中定义的int b=1,是局部变量,其作用域只在a()函数的花括号{}范围内,变量b就会被销毁,main函数无法识别和访问它

改正代码

#include<stdio.h>
//局部变量 
void a(){
	int b=1;
	printf("%d \n",b);
} 

int main(){
	a();
	int b=1;
	printf("%d",b);
}
输出如下

image.png

2.全局变量

与局部变量相对的是全局变量,它们在函数外部定义,通常位于程序的顶部。全局变量在整个程序的生命周期内都有效,可以被任何函数访问。例如,如果在a.c文件中定义了全局变量a和b,那么在b.c文件中可以通过extern关键字声明来访问这些变量。

#include<stdio.h>
//全局变量
int a=1;
void b(){
	a=2;
	printf("%d \n",a);
}

int main(){
	b();
	printf("%d",a);
	
}

输出如下(开始a=1,经过void,a变成2,main也就变成了2)

image.png

3.作用域的注意事项

如果全局变量和局部变量同名,那么在局部变量的作用域内,局部变量会覆盖全局变量。这种情况下,应该避免使用相同的名称,以免造成混淆。此外,全局变量和静态局部变量存储在内存的静态存储区中,而非静态局部变量存储在栈中。

4.练习

#include<stdio.h>
int a=200;
int b=100;
void lll(){
	int a=1;
	b=2;
	printf("a=%d,b=%d \n",a,b);
}
int main(){
	lll();
	printf("a=%d,b=%d",a,b);
}

输出如下(int a=200是赋值,不影响下面代码,b=2会改变b的值,下面会跟着改变)

image.png

5.有参数

#include<stdio.h>
void z(int m){
	m+=10;
}
int main(){
	int m=1;
	printf("%d \n",m);
	z(m);
	printf("%d",m); 
}

输出如下

image.png

6,有参数练习

#include<stdio.h>
void ab(int x,int y){
	x+=1;
	y-=1;
}
int main(){
	int x=10;
	int y=10;
	ab(x,y);
	printf("x=%d,y=%d",x,y);
}

输出如下

image.png

7.报错

#include<stdio.h>
//局部变量的产生 
int main(){
	//循环变量i,只能在循环内部使用 
	for(int i=0;i<10;i++){
		
	}
	printf("i=%d",i);
}

循环变量i,只能在循环内部使用

8.报错2

#include<stdio.h>
//局部变量的产生场景
//1.for(i)
//2.if(){}   while(){}    {}里面也是局部变量 
int main(){
	if(1){
		int i=1;
		printf("i=%d",i);
	}
	printf("i=%d",i);             //2
}

局部变量的产生场景

1.for(i)

2.if(){} while(){} {}里面也是局部变量

代码写在了{}外面