C——变量的作用域与存储类

1、变量的作用域

1.1、作用域

  • 所谓作用域就是变量的有效范围

1.2、局部变量

  • 定义:在复合语句内部函数内部定义的变量称为局部变量

  • 局部变量作用域:自定义位置起,到符合语句函数的结束

  • 在不同作用域内变量名可以重名

  • 内部与外部变量同名,内部变量优先(就近原则)

    int main(){
          
          
    	int a=3,b=0;
    	{
          
          
    		int a=5;
    		b+=a;
    	}
    	b*=a;
    	printf("%d\n",b);
    	return 0;
    }
    输出结果:15
    

1.3、全局变量

  • 定义:自函数外部定义的变量称为全局变量
  • 作用域:自定义位置起,到整个程序的结束
int a=3;
int main(){
    
    
	int s=0;
	{
    
    
		int a=5;
		s+=a++;
	}
	s+=a++;
	printf("%d\n",s);
	return 0;
}
输出结果:8

2、变量的存储类

2.1、自动型(auto)

  • 函数中的局部变量,默认都是动态分配存储空间的

  • 调用该函数时系统会给这些变量分配存储空间

  • 函数调用结束时就自动释放存储空间

  • 这类局部变量称为自动变量,用关键字auto作存储类别声明

    auto	 			int 				a;
    (可省略)存储类		类型名				变量名
    

2.2、寄存器型(register)

  • 用register声明的变量是寄存器变量,是存放在CPU的寄存器里的。而我们平时声明的变量是存放在内存中的。虽说内存的速度已经很快了,不过跟寄存器比起来还是差得远。

2.3、静态型(static)

  • 静态局部变量的值在函数调用结束后不消失,而保留原值,即其占用的存储单元不释放

  • 仅允许当前文件使用

    int fun(int n){
          
          
    	static int s=2;
    	s+=n;
    	return s;
    }
    int main{
          
          
    	int x=2;
    	printf("%d\n",fun(x));
    	printf("%d\n",fun(x));
    	return 0;
    }
    输出结果:
    4
    6
    

2.4、总结

  1. auto自动型:默认的类型
  2. register:寄存器型
  3. static:静态型、内部变量、内部函数,仅允许当前文件使用
  4. extern:外部变量、外部函数允许其它文件使用

3、动态存储方式与静态存储方式

  • 从变量值的生存期角度划分,可以分为静态存储方式和动态存储方式
    1. 静态:整个程序
    2. 动态:函数调用结束
  • 静态区:变量类型
    1. 静态局部变量
    2. 全局变量或外部变量
    3. 初始化在编译阶段、初值为0
  • 动态区:变量类型
    1. 动态变量

猜你喜欢

转载自blog.csdn.net/qq_45042462/article/details/125869778
今日推荐