变量的存储类别

  1. 存储类别:是指数据在内存中的存储方式
    (1)供用户使用的存储空间:
    程序区
    静态存储区:编译时候分配空间,程序结束释放空间。(存放全局变量)
    动态存储区:定义时动态分配空间,对应函数完成时就释放空间,再调用时又重新动态分配空间。(存放auto类型局部变量)
    (2)存储类型:auto,static,register,extern
    (3)变量的完整定义:存储类型,数据类型,变量名
  2. 自动变量(auto):
    (1)格式:
    [auto]数据类型 变量名[=初始化表达式]
    注:自动变量是动态分配存储空间,局部变量默认为auto类型
    (2)说明:
    未进行初始化时,自动变量的值是不定的;
    引用自动变量,必须对其初始化或对其赋值;
    对同一函数的两次调用之间,自动变量的值是不保留的;
    自动变量的初始化是在函数调用时进行的;
    函数的形参也是一种自动变量。
    (3)例:(说明动态分配存储空间情况)
main()
{int i;
  void count();
  for(i=1;i<=3;i++)
  		count(i);
}
void count(int n)
{int x;
  printf("%d:x=%d",n,x);
  x=x+2;
  printf("x+2=%d\n",x);
}
//运行结果:
1:x=1,x+2=3
2:x=2,x+2=4
3:x=3,x+2=5
  1. 静态局部变量:
    (1)格式:static 数据类型 变量名[=初始化表达式]
    注:自动变量是静态分配存储空间
    (2)说明:
    静态变量的存储空间在程序的整个运行期间是固定的,而不像动态变量是在程序执行中被建立,动态撤销的;
    静态变量的初始化是在编译时进行的;
    静态局部变量的值具有可继承性;
    静态局部变量的值只能在本函数中使用;
    C规定,只能在定义全局变量和局部静态变量时才能对数组初始化为0。
    注:什么情况下使用局部静态变量呢?
    答:需要保留函数上一次调用结束时的值;如果初始化后,变量只被引用而不改变其值则可用;函数中的数组要初始化时。
    (3)例:(分别使用自动变量和静态变量比较程序)
main()
{int i;
  void count();
  for(i=1;i<=3;i++)
  		count(i);
}
void count(int n)
{int x=1;
  static int y=1;
  printf("%d:x=%d,y=%d",n,x,y);
  x+=2;
  y+=2;
  printf("x+2=%d,y+2+%d\n",x,y);
}
//运行结果:
1:x=1,y=1,x+2=3,y+2=3
2:x=2,y=3,x+2=4,y+2=5
3:x=3,y=5,x+2=5,y+5=7
  1. 寄存器变量:
    格式:register 数据类型 变量名[=初始化表达式]
    说明:只有局部自动变量和形参可以作为寄存器变量,其他变量不行;
    一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量;
    不同的计算机系统对register变量的处理是不同的;
    局部变量不能定义为寄存器变量。
  2. 用extent声明的外部变量:
    (1)在一个文件内声明外部变量
    作用:扩展外部变量的作用范围
    (2)在多文件程序中声明外部变量(用工程文件连接时)
    作用:允许其他文件中的函数引用(这时需在引用它的文件中用extern说明)
//file 1.c
int x,y;
char ch;
main()
{
	x=12;
	y=24;
	f1();
	printf("%c",ch);
}
//file2.c
extern int x,y;
extern char ch;
f1()
{
	printf("%d,%d\n",x,y);
	ch='a';
}
  1. 用static声明外部变量
    作用:只允许本文件中的函数引用的静态变量称为静态外部变量。
    注:对外部变量加或不加static说明都是静态存储方式,只是作用范围不同而已。
  2. 存储类别小结
    对一个数据的定义,需要指出两种属性:数据类型和存储类型,分别用两个关键字定义。在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34752068/article/details/83075526