【C进阶】5、变量属性

Summary

1)auto是C语言中局部变量默认属性;auto表明将被修饰的变量存储于栈上(局部变量的存储位置)

2)register将声明的局部变量存储于寄存器中;register是一种请求,不一定成功;不能用取地址符&去取register变量的地址

3)static关键字主要体现两个方面的意义:

  • 指明变量的静态属性(生命期存储位置静态局变存储区从栈上变到全局数据区)
  • 限定变量的作用域静态全局变量、静态函数:作用域只在当前文件中,本来是程序作用域)

4)extern关键字主要有两个方面的用途:

  • extern告诉编译器,我声明的变量和函数都存在的,在其他地方定义了,你只管放心用。(定义指的是:给变量分配内存空间,给函数确定的函数体)
  • extern "C" { // Demo here }命令编译器用C的方式编译。常见用法:C++需要用到C的库,都是二进制sdk,源码是不可能改的。如果用C++的方式编不过,就用下面方式使用

    extern "C"
    {
    #include "xx.h"  // C库的头文件
    }

C语言中的各种属性关键字

  • C语言中的变量可以有自己的属性
  • 在定义变量的时候可以加上属性关键字
  • “属性”关键字指明变量的特有意义

    • 语法:property type var_name;
    auto char i;
    register int j;
    static long k;
    extern double m;

1、auto

  • auto是C语言中局部变量默认属性
  • auto表明将被修饰的变量存储于栈上
  • 编译器默认所有的局部变量都是auto的;

    void f()
    {
      int i;       // 局部变量默认属性是auto
      auto int j;  // 显示声明属性为auto
    }

2、register

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

    register int g_v;  // error
    
    int main()
    {
      register char var;
      
      printf("%08x", &var);   // error
    }

问题1:为什么不能将全局变量存储为寄存器变量?
答:因为寄存器的访问速度比内存的速度要快的多,所以在C语言中为了高效,把一些需要访问高效的变量存储为寄存器变量。全局变量的生命期是程序生命期,如果存储为register变量,就会一直占用该寄存器,这是不允许的。
因为CPU的寄存器是有限的,因此register只是一种请求,不一定成功。

问题2:为什么不能取寄存器的地址?
答:因为取地址符&只能用来取内存的地址

3、static

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

    • static修饰的局部变量存储在程序静态区
  • static关键字同时具有“作用域限定符”的意义

    • static修饰的全局变量作用域只是声明的文件中
    • static修饰的函数作用域只是声明的文件中
int g_v;          // 全局变量,程序的任意地方都可以访问
static int g_vs;  // 静态全局变量,只能在当前文件中访问(作用域只是当前文件)
int main()
{
    int var;          // 局部变量,在栈上分配空间
    static int svar;  // 静态局部变量,全局数据区分配空间
}

4、 extern

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

    • extern变量在文件的其他地方分配空间(在其他地方定义的)
    • extern函数在文件的其他地方定义函数体
  • extern用于“告诉”编译器用C方式编译
    C++编译器或者其他一些变种C编译器会默认按自己的方式来编译函数和变量,通过extern "C"可以命令编译器“以标准C方式进行编译”

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

本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请指正。

你可能感兴趣的:(c)