变量的属性——存储类关键字

auto关键字

  1. auto关键字在C语言中只有一个作用,就是修饰局部变量
  2. auto修饰局部变量,表示这个局部变量是自动局部变量,自动局部变量分配在栈上
  3. 编译器默认所有的局部变量都是auto的。

示例代码

void func()
{
  int i;          //局部变量默认属性为auto

  auto int j;     //显式声明auto变量
}

register关键字

  1. register 关键字指明局部变量存储与寄存器中
  2. register 只是请求寄存器变量,但不一定请求成功
  3. register 变量必须是CPU寄存器可以接受的值
  4. 不能用&运算符获取register变量的地址

示例代码

#include <stdio.h>

register int g_v;     //error

int main()
{
  register int i;
  printf("0x%08X",&i);     //Error

  return 0;
}

注:
1. 因为寄存器访问的速度比内存快很多,所以register修饰的变量适合用在那种变量被反复高频率的使用,通过改变这个变量的访问效率可以极大提升程序的运行效率

  1. 因为SoC的寄存器是有限的,编译器不可能让你无限制的将变量存放在寄存器中,慎用register关键字。

  2. 因为&运算符是取内存地址,而register是存放在寄存器中的,而寄存器不属于内存,所以&并不能取register变量的地址。

static关键字

static关键字在C语言中有2种用法,而且这两种用法彼此没有任何关联,完全是独立的。

static 关键字致命变量的“静态”属性
- static 修饰的局部变量存储在程序静态区

static 关键字同时具有“作用域限定符”的意义
- static 修饰的全局变量作用域只是声明在文件中
- static 修饰的函数作用域只是声明在文件中

示例代码:

#include <stdio.h>

int f1 ()
{
    int x = 0 ;
    x ++;

    return x;
}

int f2 ()
{
    static int y = 0 ;
    y ++;


    return y;
}

int main ()
{

    auto int i = 0 ;
    for (i =0 ; i < 5; i ++)
    {
        printf ( "%d\n" , f1 ());
    }

    for (i =0 ; i < 5; i ++)
    {
        printf ( "%d\n" , f2 ());
    }
    return 0 ;
}

输出结果
1
1
1
1
1
1
2
3
4
5

extern关键字

extern用于声明“外部”定义的变量和函数
- extern变量在文件的其它地方分配空间
- extern函数在文件的其它地方定义

extern用于“告诉”编译器用C方式编译
- C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通过extern关键字可以命令编译器“以标准C方式进行编译”。

示例代码:static和extern的使用

//test.c
#include <stdio.h>

static int i = 1;

int func()
{
    extern int i;

    printf("i = %d\n",i);
    printf("i = %p\n",&i);

    return 0;
}

//main.c
#include <stdio.h>

int main()
{

    //extern int i;  //Error

    func();

    return 0;
}

输出结果
i = 1
i = 0x804a014

注:如果extern用于标识符的第2次或以后的声明时,不会更改第1次声明所指定的链接属性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值