C语言的变量属性 - auto、register、static、extern

1、C语言的变量属性

C语言的变量可以有自己的属性

定义变量的时候可以加上"属性"关键字

"属性"关键字指明变量的特有意义

语法:property type var_name

例如:

int main()
{
    auto char i;
    register int j;
    static long k;
    extern double m;

    return 0;
}

 

2、auto关键字

auto即C语言中局部变量的默认属性

auto表明将被修饰的变量存储于

编译器默认所有的局部变量都将是auto

 

3、register关键字

register关键字指明将局部变量存储于寄存器中(速度快呀,不需要一直去内存取)

register只是请求寄存器变量,但不一定成功

register变量的值必须是CPU寄存器可以接受的值

不能用&运算符获取register变量的地址(对比与C++的不同)

#include <stdio.h>  
  
register int g_v; //error  
  
int main()  
{  
    register char var;  
      
    printf("0x%08X", &var); //error  
      
    return 0;  
}  

 

4、static关键字

static关键字指明变量的“静态”属性

                - static修饰的局部变量存储在程序静态区

static关键字同时具有“作用域限定符”的意义 (安全呀)

                - static修饰的全局变量作用域只在声明的文件中

                - static修饰的函数作用域只在声明的文件中

#include<stdio.h>  
  
int g_v;            //全局变量,程序的任意地方均能访问  
  
static int g_vs;    //静态全局变量,只有当前文件可访问   
  
int main()  
{  
    int var;        //局部变量,在栈上分配空间  
      
    static int svar //静态局部变量,在静态数据区分配空间   
      
    return 0;  
}  

 

5、实例分析

auto,register,static对比分析    5-1.c

#include <stdio.h>  
  
int f1()  
{  
    int r = 0;  
      
    r++;  
      
    return r;  //返回局部变量的值
}  
  
int f2()  
{  
    static int r = 0;  
      
    r++;  
      
    return r;  //返回静态局部变量的值
}  
  
  
int main()  
{  
    auto int i = 0;       // 显示声明 auto 属性,i 为栈变量  
    static int k = 0;     // 局部变量 k 的存储区位于静态区,作用域位于 main 中  
    register int j = 0;   // 向编译器申请将 j 存储于寄存器中  
  
    printf("%p\n", &i);  
    printf("%p\n", &k);  
    //printf("%p\n", &j);  //error: address of register variable ‘j’ requested 
      
    for(i=0; i<5; i++)  
    {  
        printf("%d\n", f1());  
    }  
      
    for(i=0; i<5; i++)  
    {  
        printf("%d\n", f2());  
    }  
      
    return 0;  
} 

地址差距很大,static只改变了变量的存储区,却无法改变局部变量的作用域

static变量生命周期为程序运行周期

 

6、extern关键字

extern用于声明“外部”定义的变量和函数

                    - extern变量在文件的其它地方分配空间

                    - extern函数在文件的其它地方定义

extern用于“告诉”编译器用C方式编译

                - C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,

                   通过extern关键字可以命令编译器“以标准C方式进行编译”

extern "C"
{
    int f(int a, int b)
    {
        return a + b;
    }
} 

 

7、编程实验

static和extern的使用

示例1

#include<stdio.h>  
  
extern int g_i;//声明该变量已经定义(分配空间)   
  
int main()  
{  
    printf("%d\n", g_i);  //不提前声明程序执行流执行到这里肯定会出错呀
      
    return 0;  
} 
  
int g_i;//定义 

       

示例2

5-2.c

#include <stdio.h>  
  
extern int getI();  //声明该函数已经定义 
  
int main()  
{  
    printf("%d\n", getI());  
         
    return 0;  
}  

g.c

static int g_i;  //只能在本文件中使用
  
int getI() //定义函数
{  
    return g_i;  
}  

               

8、小结

auto变量存储在程序的栈中,默认属性

static变量存储在程序静态区中

register变量请求存储于CPU寄存器中

extern变量在文件的其它地方分配空间

extern能够指示编译器按照标准C方式编译程序

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值