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

 

posted @ 2017-12-09 09:43  H&K  阅读(341)  评论(0)    收藏  举报