5_变量属性

关键词:C语言的变量属性、auto关键字、 register关键字、 static关键字、extern关键字

1. C语言的变量属性

  • C语言中的变量可以有自己的属性,在定义变量的时候可以加上属性关键字属性关键字指明变量的特有意义。
  • 语法:property type var_name;
  • 示例:
int main()
{
  auto char i;
  register int j;
  static long k;
  extern double m;

  return o;
}

2. auto关键字

  • auto即C语言中局部变量的默认属性
  • auto表明将被修饰的变量存储于栈上
  • 编译器默认所有的局部变量都是auto
    示例:
void f()
{
  int i;  // 局部变量默认属性为 auto

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

3. register关键字

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

示例:


#include <stdio.h>

   register int g_v; // error: register name not specified for ‘g_v’

int main()
{
    register char var;
    
    printf("0x%08x\n", &var);   // error: address of register variable ‘var’ requested

    return 0;
}

4. static关键字

  • static关键字指明变量的静态属性
    static修饰的局部变量存储在程序静态区,即局部变量未被static修饰时,变量位于栈空间,局部变量被static修饰后,变量位于静态区这个局部变量的生命周期和全局变量的生命周期相同,作用域只在局部区域

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

#include <stdio.h>

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

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

int main()
{
    int var;        // 局部变量,在栈上分配空间
    
    static int svar;    // 静态局部变量, 在静态数据区分配空间

    return 0;
}

5. autoregisterstatic对比分析

#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: address of register variable ‘j’ requested 
    
    for(i=0; i<5; i++)
    {
        printf("%d\n", f1());   
    }
    
    for(i=0; i<5; i++)
    {
        printf("%d\n", f2());   
    }
    
    return 0;
}

输出结果:

0xbfdeb84c
0x804a01c
1
1
1
1
1
1
2
3
4
5

总结:
auto修饰的变量i的地址值为:0xbfdeb84c,static修饰的变量j的地址值为:0x804a01c。两地址值相差较大的原因是因为变量i位于栈空间,变量j位于常量区
f1()中的变量r位于栈空间,每次调用时被初始化为0,f2()中的变量r位于静态区,只被初始化一次,r的生命周期为程序的运行周期,每次对它的改动都会被保留下来。

6. extern关键字

作用一:extern用于声明外部定义的变量和函数
extern变量在文件的其它地方分配空间
extern函数在文件的其它地方定义
作用二:extern用于告诉编译器用C方式编译
C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通过extern关键字可以命令编译器以标准C方式进行编译。如:

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

7. staticextern的使用

test.c

#include <stdio.h>

extern int g_v; // 告诉编译器变量g_v在其他地方已经定义

int main()
{
    printf("%d\n", g_v);
    
    return 0;
}

g.c

int g_v = 10;   // 定义全局变量 g_v

输出结果:
  • g.c中用static修饰后,源代码如下:
static int g_v = 10;    // 定义全局变量 g_v

输出结果:

错误原因:static修饰的全局变量作用域仅在声明的文件中,其它文件访问不到,因此在test.c中编译器会提示g_v没有定义。解决方法:
test.c

#include <stdio.h>

extern int getV();  // 告诉编译器函数getV()在其他地方已经定义

int main()
{
    printf("%d\n", getV());
    
    return 0;
}

g.c

static int g_v = 10;    // 定义全局变量 g_v

int getV()
{
    return g_v;
}

输出结果:

8. 小结

  • auto变量存储在程序的中,为默认属性
  • static变量存储在程序静态区
  • register变量请求存储于CPU寄存器
  • extern变量在文件的其它地方分配空间
  • extern能够指示编译器按照C方式编译程序

声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 注:这是第三遍读《C语言深度解剖》,想想好像自从大学开始就没读完过几本书,其中谭浩强的那本《C语言程序设计(第四版...
    HavenXie阅读 1,716评论 1 6
  • 1、c语言的函数有以下特点: (1)才源程序由函数组成,一个主函数main()+若干其他函数 C程序中的函数类似文...
    滕王阁序阅读 1,330评论 0 6
  • 【转载】C&C++——C函数与C++函数相互调用问题 C C++相互调用 在项目中融合C和C++有时是不可避免的,...
    天之道天知道阅读 3,426评论 2 19
  • 猫因生活所迫,在狐狸开的夜来香发廊坐台,一日老鼠来到发廊点名要将猫包夜,猫誓死不从,老鼠大怒道:“当初追老子追得死...
    范末末阅读 260评论 0 2
  • 这些都是易联的荣誉。。呵呵看着真刺眼!你们对得起这些证书吗?你们知道什么叫羞耻吗?坑害老百姓的钱真是不觉得桑良心昂...
    志愿_3252阅读 151评论 0 0