c中变量存储类型
存储类型:auto static register extern (说明型)
auto:默认,自动分配空间,自动回收空间,不会初始化其值,理论上随机的,编译器优化成相应类型的初始值
register:(建议型)寄存器类型,只能定义局部变量,不能定义全局变量,大小有限制,只能定义32位大小的数据类型,寄存器变量没有地址,所以一个寄存器变量无法打印出地址查看或使用
static:静态型,自动初始化为0或者空值,值有继承性。常用于修饰变量或者函数(控制变量或者函数的作用域)
extern:说明型,不能改变被说明变量的值或者类型
变量生命周期和作用范围
1.全局变量和局部变量
2.局部变量和局部变量
|
局部变量 |
外部变量 |
|||||
|
存储类别 |
auto |
register |
局部static |
外部static |
外部 |
|
|
存储方式 |
动态 |
静态 |
||||
|
存储区 |
动态区 |
寄存器 |
静态存储区 |
|||
|
生存期 |
函数调用开始到结束 |
程序整个运行期间 |
||||
|
作用域 |
定义变量的函数或复合语句内 |
本文件 |
其它文件 |
|||
|
赋初值 |
每次函数调用时 |
编译时赋初值,只赋一次 |
||||
|
未赋初值 |
不确定
|
自动赋初值0或空字符 |
||||
局部变量默认auto
register型变量个数受限,且不能为long,double,float型
局部static变量具有可继承性,全局寿命和局部可见性
extern不是变量定义,可扩展外部变量作用域
#include <stdio.h> #include <stdlib.h> int main(){ auto int i; float j; static int x; static double y; printf("i=%d\n",i); printf("j=%f\n",j); printf("x=%d\n",x); printf("y=%f\n",y); exit(0); } 输出结果是 i=0 j=0.000000 x=0 y=0.000000
#include <stdio.h> #include <stdlib.h> void func(void){ int x=0; static int y; y++; x++; printf("x: %p->%d\n",&x,x); printf("y: %p->%d\n",&y,y); printf("-----------------------\n"); } int main(){ func(); func(); func(); exit(0); } 结果是 x: 0x7fff16f7c5ac->1 y: 0x6009e8->1 ----------------------- x: 0x7fff16f7c5ac->1 y: 0x6009e8->2 ----------------------- x: 0x7fff16f7c5ac->1 y: 0x6009e8->3 ----------------------- x的地址不一定是一样的,可能是一样的 y的地址一定是一样的
作用域
#include <stdio.h> #include <stdlib.h> int i=1; int main(){ printf("i=%d\n",i); int i=2; { int i=3; printf("i=%d\n",i); } printf("i=%d\n",i); exit(0); } 结果 i=1 i=3 i=2 找最近范围内的变量 找不到再到上级范围结构里找
static在单文件里修饰变量和函数 表示只在此文件里有效
main.c
#include <stdio.h> #include <stdlib.h> int i=1; int j=2; int main(){ call_func(); //func(); }
proj.c
#include <stdio.h> #include <stdlib.h> static int i=11; int j=22; static void func(void){ printf("%s,i=%d\n",__FUNCTION__,i); printf("%s,j=%d\n",__FUNCTION__,j); } void call_func(void){ printf("%s\n",__FUNCTION__ ); func(); }
gcc main.c proj.c
[root@localhost proj]# gcc main.c proj.c
/tmp/ccafwSkH.o:(.data+0x4): multiple definition of `j'
/tmp/ccflZ6nS.o:(.data+0x4): first defined here
collect2: ld 返回 1
i不会报冲突
把main.c里的j定义去掉
call_func
func,i=11
func,j=22
proj.c里定义的auto变量或者函数,main函数里识别不了,main.c里定义和proj.c里同名的变量,编译时又报重复定义的错误
只能各种里用static修饰防止编译时报重复定义和使用时找不到
static修饰函数
使当前函数只在当前的.c文件里生效
extern
//main.c #include <stdio.h> #include <stdlib.h> #include "proj.h" int i=1; int main(){ printf("[%s]:i=%d\n",__FUNCTION__,i ); func(); exit(0); } //proj.c #include <stdio.h> #include <stdlib.h> #include "proj.h" extern int i; //或者extern i; void func(void){ printf("%s,i=%d\n",__FUNCTION__,i); } //proj.h #ifndef PROJ_H #define PROJ_H void func(void); #endif

浙公网安备 33010602011771号