上一篇文章学习了C语言中的类型转换,点击链接查看:【C语言进阶深度学习记录】四 C语言中的类型转换.

文章目录

  • 1 C语言的变量属性
    • 1.1 auto关键字
    • 1.2 register关键字
    • 1.3 static 关键字
    • 1.4 代码案例分析
    • 1.5 extern 关键字
    • 1.6 代码案例分析
  • 2 总结

1 C语言的变量属性

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

上面的例子中给出了几个属性,下面对这些属性做一些说明。

1.1 auto关键字

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

如:

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

1.2 register关键字

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

如:

#include <stdio.h>register int g_val;   //errorint main(){register char var;printf("0x%08X", &var);    //errorreturn 0;
}

1.3 static 关键字

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

    • static 关键字修饰的局部变量存储在程序静态区,也就是数据区(data或bss)
  • static关键字同时具有“作用域限定符”的作用

    • static声明的全局变量,作用域仅在声明的文件中
    • static修饰的函数,作用域仅在声明的文件中
# include <stdio.h>int g_val;            //全局变量,可以在程序的任意位置访问
static int g_sval;   //静态全局变量,只在当前文件中可以访问
int main(){int var;           // 局部变量,在栈上分配空间static int svar;  // 静态局部变量,在静态数据区分配空间return 0;
}

1.4 代码案例分析

  • 代码:5-1.c
#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);   // errorfor(i=0; i<5; i++){printf("%d\n", f1());}for(i=0; i<5; i++){printf("%d\n", f2());}return 0;
}
  • 编译运行结果为(gcc 4.4.5):

可以看到:

  • i和k的地址不在一起,i在栈上,k咋数据区
  • 函数f1中,r为局部变量,每次调用该函数,r都是一个新的变量,每次都是0
  • 函数f2中,r为static变量,为静态区的变量,在数据区中,所以一直存在,不会消失,每次调用f2函数,r的值都增加一。

1.5 extern 关键字

  • extern用于声明外部定义的函数或者变量

    • extern变量在文件的其他地方分配空间
    • extern函数在文件的其他地方定义
  • extern “告诉”编译器用C方式编译源代码(比如在C++语言中写C语言代码)

1.6 代码案例分析

  • 5-2.c代码
#include <stdio.h>extern int getI();int main()
{printf("%d\n", getI());return 0;
}
  • g.c
static int g_i;int getI()
{return g_i;
}
  • 编译:gcc 5-2.c g.c -o lyy.out
  • 运行:.lyy.out

运行结果为0;

这个比较简单就不做分析了

2 总结

  • auto变量存储在栈中,局部变量的默认属性
  • static变量存储在程序的静态区,也就是数据区
  • register请求变量存储在CPU 寄存器中(不一定能请求成功)
  • extern变量在文件的其他地方分配存储空间
  • extern能够指示编译器按照标准C的方式来编译代码

【C语言进阶深度学习记录】五 C语言中变量的属性相关推荐

  1. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  2. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  3. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  4. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  5. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  6. 【C语言进阶深度学习记录】八 C语言中void的分析

    文章目录 1 void的意义 1.1 不存在void变量 1.2 C标准 1.3 void指针的意义 1.4 通过void* 实现memset函数 2 总结 1 void的意义 void修饰函数的参数 ...

  7. 【C语言进阶深度学习记录】十七 宏定义的使用与分析

    文章目录 1 C语言中的宏定义 1.1 定义宏常量 1.2 宏定义表达式 1.3 宏表达式与函数的对比 1.4 宏表达式的作用域 2 C语言中的内置宏 3 宏定义的代码综合示例 4 总结 1 C语言中 ...

  8. 【C语言进阶深度学习记录】九 C语言中const的详细分析

    文章目录 1 const的分析 2 const本质的分析实验 2.1 代码案例分析 3 const修饰函数参数和返回值时的情况 3.1 代码案例分析 4 总结 1 const的分析 不管是C语言还是C ...

  9. 【C语言进阶深度学习记录】一 数据类型的本质与变量的本质

    今天学习C语言中的数据类型的本质与变量的本质 文章目录 1 什么是数据类型 2 变量的本质 3 数据类型与变量的关系 4 自定义数据类型与创建变量 5 总结 1 什么是数据类型 数据类型可以理解为固定 ...

最新文章

  1. WordPress ProPlayer插件‘id’参数SQL注入漏洞
  2. wxPython事件处理
  3. LeetCode 475. 供暖器(双指针二分查找)
  4. 七大新品集中亮相,腾讯云AI大数据全线升级!
  5. 学习笔记之grub应用
  6. 104规约使用总结(四)——调试工具
  7. 算法岗和开发岗有什么区别?
  8. 计算机防止检查清理软件吗,清除电脑垃圾用什么软件好 如何预防电脑卡顿
  9. 客户说发货慢怎么回复_物流走件慢回复话术
  10. JQuery右下角弹窗广告
  11. 2021年安徽省大数据与人工智能应用竞赛大数据-本科组赛题
  12. Docker基础命令学习
  13. java this 逸出_this引用逸出
  14. 4_MySQL_聚合函数和条件查询
  15. 直播课报名 | 2022 看云计算如何赋能跨境电商企业再增长
  16. 初学者对测绘软件的了解
  17. 看一个屌丝脱屌的经历有感,谈谈脱屌者的经验和自己的感想
  18. Office Visio软件在工控原理图中的应用
  19. 双色球全部开奖数据(json版)15年(2003~2015)开奖结果
  20. java getdc_GetWindowDC-BeginPaint-GetDC 区别详解

热门文章

  1. 第一百期:Java架构师:高并发下的流量控制
  2. java学习(137):java异常初识
  3. oracle中错位函数,Oracle中的一些函数
  4. C++自定义对象如何支持Range-based循环语法
  5. java薪资年龄交叉表_巧用参数实现交叉表行列互换
  6. ASP正则表达式方面小笔记
  7. 碎片脚本注解(后续整理)
  8. web APIS
  9. c++中怎么数组内有用元素的个数_前端面试(算法篇) - 数组乱序
  10. PMP读书笔记(第7章)