PoEdu培训 C语言提高班1 数据类型本质,static属性,生命周期和作用域
文章类别: 培训笔记 0 评论

PoEdu培训 C语言提高班1 数据类型本质,static属性,生命周期和作用域

文章类别: 培训笔记 0 评论

数据类型本质和static和生命周期和作用域

思维导图

Alt 前置代码

数据类型

本质

数据类型的本质就是 内存地址 + 数据长度

作用

它是一种模型, 它能够方便的对数据进行定位, 并规定数据大小.

表示方式

基础数据类型
自定义数据类型

使用 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语言中, 它是一个变量的 "属性" 

编译器中, 默认的局部变量数据类型的属性为 auto
auto 属性默认变量在 空间中分配
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如果修饰的是局部变量, 该变量的生命周期会改变, 但是作用域依旧不变.

如有错误,请提出指正!谢谢.

评论已关闭.