今天我们重点说下auto,register,typedef,extern,和static。

让我们进入今天的学习吧!(今天也要加油哦)

1. auto(自动变量)

auto作为比较老的关键字,在C语言中使用的有限,简单说下语法吧。
auto:它很宽宏大量的,你就当它不存在吧,在缺省的情况下所有局部变量都是 auto 的。auto被叫做自动变量,就是变量空间自动申请释放,就是自动变量。

2 . static(静态变量)

static修饰的变量时,放在了静态数据区。
在上上篇博客中很详细说了,就不在赘述了。
static常考点

3.register(寄存器变量)

3.1 register语法

这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内
存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个 CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多 register 变量,没有那么多的寄存器让register用。

3.2 寄存器变量可以取地址吗?

各位读者大人,想一个问题,那么可以对寄存器变量进行取地址操作吗?
例 1:

    register a = 10;printf("%p\n", &a); //error C2103 : 寄存器变量上的“&”return 0;

这个例子就证明了,register变量不可被取地址,为什么不可以被取地址呢?
因为地址是内存相关的概念,你要取地址也要在内存上取吧,不在内存怎么取地址呢?

举个例子帮助理解下: 这就像一个人开车闯红灯要扣6分,但是人家就没有驾照你咋扣分呢?

3.3什么情况下使用register修饰变量的?

1.局部变量,(全局变量会占据寄存器)
2.不会被写入的(一旦写入,就要返回内存,然后再被检测)
3.被高频读写的(高频读写的放入寄存器中,会更容易的让CPU拿到)

3.4 register的变量的细节

寄存器变量是可以被赋值的。
例 2:

   int main()
{register a = 10;a = 100;printf("%d\n", a);//100return 0;
}

寄存器变量的默认数据类型是int


也可以定义其他类型
例 3:

int main()
{register char a = 10;a = 100;printf("%d\n", a);//a的类型是 charreturn 0;
}

4.extern(外部存储变量)

4.1 extern作用

extern变量称为外部存储变量。extern声明了程序中将要用到但尚未定义的外部变量。通常,在C语言中extern主要负责的再头文件中的全局变量的声明,函数的声明。

4.2 extern的注意事项

首先extern声明外部符号的,在头文件中声明函数和全局变量的。
例 4:

extern int a;
extern void fan();

那么再声明时可以初始化吗?
首先声明并非定义,定义时开辟的有空间,而声明中没有空间,所以声明不可以初始化。
声明时可以省略extern吗?
语法上不管是变量还是函数,不加extern好像都不会出错,但是就变量而言定义不初始化和声明是一样的写法
例 5:

int a;//声明
int a;//定义但不初始化

没有注释,各位读者能分清楚声明和初始化吗?我想不能吧。所以在声明变量时,必须要带上extern

那么函数呢,是不是可以不带extern呢?
例 6:

void fan();//声明
void fan()//定义

从直观上是看可以看出来的,以分号结束的是声明,但是还是推荐大家声明函数时也带上extern。

声明可以多次吗?
可以多次声明,但是不可以多次定义。
举个例子: 你买彩票中奖了,你可以说很多次,但是就彩票中奖来说,你只中了一次,同理,声明可以多次,但定义只有一次。

5.typedef(特殊的存储类型)

5.1 typedef解释

typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个别名,而非定义一个新的数据类型。

5.2 typedef的使用

5.2.1 对结构体进行typedef
下面是结构体进行重命名之后的类型查看,来进一步判断是否typedef创建了新的类型。
例 7:

struct str//定义结构体
{int a;
};typedef struct str  _str;//对结构体进行重命名int main()
{struct str ret = { 0 };//创建结构体变量_str  val = { 0 };//用typedef定义类型创建变量struct str * p = &val;//把typedef的变量地址存进结构体指针中return 0;
}

调试查看类型可以看出类型是一样的。

5.2.2 对数组进行typedef
例 8:

typedef int a[10];//定义一个类型 int[10] 名字是aint main()
{int b[10] = { 0 };//定义一个数组,数组类型是 int[10]a  c = { 0 };//用a定义一个数组,数组类型是areturn 0;
}

调试,查看类型,看出,a和b数组类型一样。

5.2.3 typedef对unsigned int重命名。
例9 :

typedef unsigned int  _int;int main()
{unsigned int a = 0;_int b = 0;return 0;
}

调试看出,a,b类型一样

综上所述,可以看出typedef只是换了个名字,但是最终类型不变,有种换汤不换药的感觉。

5.3 typedef 和 define做比较

看个例子加深下理解
例 10:

typedef int* ptr_t;
int main()
{ptr_t a, b;//没初始化,不推荐大家写,只做研究return 0;
}


这里看出typedef定义两者的类型是一样的。

例 10:

#define PTR_T  int*
int main()
{PTR_T a, b;//不推荐这样写,只做研究return 0;
}

define定义的可以看出不是一个类型,a是int*的,b是默认的int型。

得出结论
define 是定义一个宏来进行替换。
而typedef是把一个变量的名字换了。

6.总结存储类型关键字

这些存储类型关键字,上述也都说过了,他们或多或少的对一些变量或者函数的说呢过命周期和作用域,以及变量开辟空间相关,还有一个比较特殊的关键字typedef也归结到了存储类型关键字了。

重点来了
这些存储类型关键字不可以同时修饰一个变量


这是不可以的,数据只有一个存储类型,一个以上出现是不可以的。

下期预告

下期讲下volatile和sizeof,各位看官明天见

都看到这里了,给个三连吧

C语言 存储类型关键字详解相关推荐

  1. 由ANSI标准定义的C语言关键字,C语言32个关键字详解

    C语言中32个关键字详解 由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register ...

  2. java语言之super关键字详解

    文章目录 前言 一.super介绍 二.super的语法 三.super内存图 四.super小结 前言 你第一次遇到super关键字是什么时候呢?是不是使用IDEA或者eclipse快捷键生成类构造 ...

  3. c语言存储类型关键字作用,C语言, 存储类型关键字?

    1.C语言的数据类型分类 C语言的数据类型分类: 基本数据类型: 整型int 字符型char 浮点型: 单精度浮点型float 双精度浮点型double 构造数据类型: 数组(如int a[]) 结构 ...

  4. c语言存储类型关键字作用,c语言学习笔记.关键字.存储类型关键字等

    关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...

  5. C语言之static关键字详解

    目录 前言: 一.几个概念 1.变量 2.局部变量和全局变量 3.变量的作用域 4.变量的生命周期 二.static关键字的作用 三.static关键字修饰局部变量 四.static关键字修饰全局变量 ...

  6. c语言程序关键字是什么,C语言中32个关键字详解

    C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...

  7. c语言关键字extern作用,C语言中extern关键字详解

    <C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...

  8. swift. 扩展类添加属性_swift中的声明关键字详解

    原起 学习swift,swift中的关键字当然要了解清楚了,最近在网上看到了关于声明关键字的文章,整理记录一下. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...

  9. c语言中ANSI标准的关键字,C语言中32个关键字详解

    C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...

最新文章

  1. CA证书服务器(4) 证书、CA、PKI
  2. java-集合排序,队列,散列表map以及如何遍历
  3. linux系统在硬盘上安装程序,在硬盘中安装Linux操作系统最简单的方法
  4. mysql慢查询日志 Mysql慢查询
  5. Android开发之高斯模糊效果三行代码搞定附带CSDN源码请导入module
  6. JS中typeof的用法
  7. java poi 设置标题_poi生成Word时指定文本样式,如“正文”,“标题1”,“标题2”等...
  8. 百度算法频频更新,草根站长的出路何在?
  9. JAR包自动启动脚本
  10. 计算机图形学上机心得,计算机图形学学习的心得体会
  11. 蓝墨云班课php答案,蓝墨云班课试题库答案
  12. 图像坐标球面投影_PostGIS空间数据库SRID背景知识 - 地理坐标系(球面坐标系)和投影坐标系(平面坐标系)...
  13. 004_simulink建立子系统
  14. C语言中文网教程导航
  15. C7N新增,保存,删除基础模板
  16. hive面试题总结(2020最新版)
  17. 券商卖的雪球票息高,券商赚的什么钱?(雪球原理入门)
  18. word里面怎么在框里打勾
  19. linux su 资源不可用,CentOS 6/Linux su: 无法设置用户ID: 资源暂时不可用
  20. 窗口置顶工具v2.4.0

热门文章

  1. socket常用参数解释
  2. 基于OpenStack的云计算平台搭建
  3. 在Python里,用股票案例讲描述性统计分析方法(内容来自我的书)
  4. golang并发http请求几种方式
  5. 冒死改造好基友小黄鸭,结果出乎意料?!
  6. 【图像分类】Deep Layer Aggregation论文理解
  7. 直接插入排序顺序结构
  8. eclipse 显示繁体中文问题
  9. word一打字就有下划线_word下划线上怎么打字 不破坏下滑线技巧
  10. 巧用天翼云盘备份云主机数据