乐趣区

关于c: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 语言进阶课程》。
如有错漏之处,恳请斧正。

退出移动版