声明:“我要用这个东西,但是还没用它,你不要给我申请内存空间”
①c这个变量已经在其他文件中定义过了,在这里声明“我要用”。
extern int c; // 这是声明,不是定义
②结构体、联合体、类等构造数据类型以及枚举在进行抽象定义还未实例化的时候,即是在声明。
定义:“我现在就要用这个东西,你给我申请好内存空间”
关于“定义”这个概念的理解:
①任何对数据的定义都包含了声明;
②定义的作用在于申请内存:任何数据在定义后就算不初始化也会分配内存空间,包括数组。
初始化:在定义对象的时候给对象赋值
未初始化的各种数据类型是什么值的问题并不重要,因为我们一般不会使用没有被初始化的对象,这并没有意义,以下是使用华为的cloudshell在Ubuntu20.04上对int、float、char、void*、static int、const int测试的情况:
通过以上的情况可以看到:
基本数据类型的默认值:
int、float、char这些基本数据类型在未初始化的时候其值是任意的;
bool类型在C语言中也是任意的,C++中专门提供了bool类型,我还不确定其未初始化的默认值是什么,无所谓,我们在实际编程中一定会初始化的;
枚举类型有其默认值:从0开始的整型。
指针的默认值:
NULL,这个全0的地址是在内存模型的保留区域,因为保留区域的地址值最低。
static对象的默认值:
0
const的默认值:
const int ci; // 没有给ci初始化,ci有一个随机值,这个随机值已经作为ci的值了
ci = 333; // 此时你再给ci赋值,会报错:error: assignment of read-only variable ‘ci’
根据上面,可见:如果我们想正确使用const,我们必须给ci初始化!