变量属性

变量属性#

C语言的变量属性##

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

auto关键字###

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

register关键字###

  • register关键字指明局部变量存储在寄存器中
  • register只是请求寄存器变量,但不一定请求成功
  • register变量的必须是CPU寄存器可以接受的值
  • 不能用&运算符获取register变量的地址
#include <stdio.h>
register int g_val ; // error
int main()
{
    register char var;
    printf("0x%08x",&var); // error
     return 0;
}

static关键字

  • static关键字指明变量的“静态”属性
  • static关键同时具有“作用域限定符”的意义
    • static修饰的全局变量作用域只是声明的文件中
    • static修饰的函数作用域只是声明的文件中
#include <stdio.h>
int g_var; // 全局变量,程序的任意地方都能访问
static int g_vs; // 静态全局变量,只有当前文件中可以访问
int main()
{
    int var;  // 局部变量,在栈上分配空间
    static int s_var; // 静态局部变量,在静态数据区分配空间
    return 0;
}

例子:

#include <stdio.h>
int f1()
{
    int r = 0;
    r++;
    return r;
}
int f2()
{
    static int r = 0;
    r++;
    return r;
}
int main(int argc, char const *argv[])
{
    auto int i = 0;
    static int k = 0;
    register int j = 0;

    printf("%p
",&i);
    printf("%p
",&k);
    // printf("%p
",&j); // error

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

结果:

extern 关键字

  • extern 用于声明“外部”定义的变量和函数
    • extern 变量在文件的其他地方分配空间
    • extern 函数在文件的其他地方定义
  • extern 用于“告诉”编译器用C语言方式编译
extern "C"
{
    int f(int a,int b)
    {
        return a + b;
   }
}

static 和extern

#include <stdio.h>
extern int g_i;
int main()
{
    printf("%d
",g_i);
}
int g_i;

总结:

  • auto变量存储在程序的栈中,默认属性
  • static 变量在程序静态区中
  • register变量请求存储于CPU寄存器中
  • extern变量在文件的其它地方分配空间
  • extern 能够指示编译器按照标准C方式编译程序
原文地址:https://www.cnblogs.com/yanyun888/p/6061235.html