软件编程
位置:首页>> 软件编程>> C语言>> C语言简明讲解变量的属性

C语言简明讲解变量的属性

作者:清风自在?流水潺潺  发布时间:2021-06-23 17:45:28 

标签:C语言,变量,属性

一、C语言中的变量属性

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

  • 在定义变量的时候可以加上“属性”关键字

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

语法:

property type var_name;

示例:

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

return 0;
}

二、auto 关键字

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

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

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

示例:

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

auto int j; //显示申明 auto 属性
}

三、register 关键字

  • register 关键字指明将局部变量存储于寄存器中

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

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

  • 不能用 & 运算符获取 register 变量的地址

#include<stdio.h>

register int g_v;    //eror

int main()
{
   register char var;

printf("0x%08X",&var);    //error

return 0;
}

四、static 关键字

static 关键字指明变量的&ldquo;静态&rdquo;属性

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

static关键字同时具有&ldquo;作用域限定符&rdquo;的意义

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

  • static 修饰的函数作用域只是声明的文件中

#include<stdio.h>

int g_v; //全局变量,程序的任意地方均能访问

static int g_vs;    //静态全局变量,只在当前文件中可访问

int main()
{
   int var;    //局部变量,在栈上分配空间

static int svar;    //静态局域变量,在静态数据区分配空间

return 0;
}

下面看一段auto,register,static对比分析代码:

#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

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

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

return 0;
}

下面为输出结果:

C语言简明讲解变量的属性

如果试图获取 register 变量 j 的地址,就会报如下错误:

C语言简明讲解变量的属性

另外,可以看到 i 和 k 的内存地址相隔很远,这是由于这两个变量一个在栈上,一个在静态区

五、extern 关键字

extern 用于声明&ldquo;外部&rdquo;定义的变量和函数

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

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

extern 用于&ldquo;告诉&rdquo;编译器用C方式编译

C++ 编译器和一些变种C编译器默认会按&ldquo;自己&rdquo;的方式编译函数和变量,通过 extern 关键可以命令编译器&ldquo;以标准C方式进行编译&rdquo;,如:

C语言简明讲解变量的属性

下面看一段 static 和 extern 的使用代码:

g.c

static int g_i;

int getI()
{
   return g_i;
}

test.c

#include <stdio.h>

extern int getI();

int main()
{
   printf("%d\n", getI());

return 0;
}

下面为输出结果:

C语言简明讲解变量的属性

注意如果想要直接在 test.c 文件里获得 g_i 的值是不行的,因为static 修饰的全局变量作用域只是声明的文件中

六、小结

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

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

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

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

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

来源:https://blog.csdn.net/weixin_43129713/article/details/123150252

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com