数据类型本质和static和生命周期和作用域
思维导图

数据类型
本质
数据类型的本质就是
内存地址 + 数据长度
作用
它是一种模型, 它能够方便的对
数据进行定位, 并规定数据大小.
表示方式
基础数据类型
自定义数据类型使用
typedef关键字定义typedef unsigned int UINT
使用#define宏定义#define UINT unsigned int
使用struct/union定义结构体
使用enum定义常量值
使用方式
[属性] 数据类型 变量名;
auto int iVal;属性可以省略
数据类型的属性, 有以下三种
auto static register
auto属性
注意:
C中的auto和C++的auto是不同的含义.
在C语言中, 它是一个变量的 "属性" 编译器中, 默认的
局部变量数据类型的属性为autoauto属性默认变量在栈空间中分配
C11 标准中,auto属性已废弃全局变量不能使用auto属性
// 举个例子:
#include <stdio.h>
// 此时, 该带码编译将不会通过
// 因为 auto 默认数据分配在 栈 空间中
// 但是我们的 iVal 是一个全局变量
// 全局变量 会分配在 全局变量区中, 编译器就会发生冲突
// 编译会报 有坏的存储类 错误 (VS2015编译器)
auto int iVal = 0;
int main()
{
return 0;
}
static属性
存储在
静态区, 并且只会初始化一次!
可以修饰全局变量和函数
还有一个强大的作用, 就是控制作用域当修饰
全局变量的时候, 该全局变量的作用域为当前文件中
其他文件无法调用当前文件中static修饰的函数和全局变量
register属性
存储在
寄存器中.
注意事项变量的值必须是
单个寄存器能够接受的值.
该变量没有地址
仅仅是发送请求,不一定成功
当不成功时, 依旧转换为auto属性.不可以修饰全局变量, 因为它会导致长时间占用寄存器.
隐含属性
作用域--> 它实际上是语法层面来说的.生命周期--> 它实际上就是地址有效的存在时间
// 举个例子
#include <stdio.h>
int main()
{
int* pVal = NULL;
for (size_t i = 0; i < 5; i++)
{
// ...
pVal = &i;
}
// 当执行完成 for 语句的时候, i 的作用域已经完结
// 但是 i 还存在, 只不过 i 的地址可能会被用作其他的作用
// 下面这句话会报错, 说明在语法层面, i 已经不存在了, 它的作用域已经完结
i = 10;
// 但是这句话, 虽然是未定义的操作, 是无意义并且非法的, 如果运气好的话, 依然可以访问到i的值
// 说明 i 的生命周期还存在着
// 最安全的方法, 是使用VS调试, 在此处打个断点, 然后进行内存查看.
printf("i:%d\n", *pVal);
return 0;
}
作用域一般是以{ }来规定的.static可以改变变量的生命周期
但是,static如果修饰的是局部变量, 该变量的生命周期会改变, 但是作用域依旧不变.
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-01-04 at 01:48 am