2、基础 | C++ 变量
1. 全局变量与 static
变量(作用域、生存周期)
全局变量
- 作用域:全局变量的作用域从它被定义的地方开始,一直到程序结束。在定义它的文件内部以及通过
extern
关键字在其他文件中都可以访问。 - 生存周期:全局变量的生存周期贯穿整个程序执行期间,从程序开始执行到程序结束。
static
变量(在函数外部定义的)
- 作用域:
static
变量具有文件作用域,即它只在定义它的文件内部可见,其他文件即使通过extern
也不能访问。 - 生存周期:与全局变量相同,
static
变量的生存周期也是贯穿整个程序执行期间,从程序开始执行到程序结束。但是,由于它的作用域限制,它只能在定义它的文件内部被访问和修改。
2. static
函数与普通函数的区别
- 作用域:
static
函数具有文件作用域,即它只能在定义它的文件内部被调用。而普通函数(非static
)则可以在整个程序中通过函数原型声明后,在任何文件中被调用(只要包含了相应的头文件或声明)。 - 链接性:
static
函数具有内部链接性(internal linkage),这意味着编译器只为该函数生成一份代码,且该代码仅在该文件内部可见。而普通函数具有外部链接性(external linkage),编译器会为每个调用该函数的文件生成一份指向该函数代码的指针(或类似的机制),以便在链接时解析函数调用。 - 使用场景:
static
函数常用于隐藏函数实现细节,减少命名冲突,或当函数只在定义它的文件内部使用时。普通函数则用于实现需要在多个文件中共享的功能。
3. 两个文件中声明两个同名变量?(使用了与未使用 extern
?)
在C++中,如果两个文件中声明了同名的全局变量,并且没有使用extern
关键字来明确指定它们之间的链接关系,那么这两个变量实际上是两个独立的变量,它们分别属于各自的文件作用域。
-
未使用
extern
:每个文件中的同名全局变量都是独立的,它们之间没有任何关系。每个变量只在定义它的文件内部可见和可访问。 -
使用
extern
:如果在一个文件中定义了全局变量(例如,在file1.cpp
中定义了int x;
),然后在另一个文件(file2.cpp
)中想要访问这个变量,就需要在file2.cpp
中使用extern
关键字来声明这个变量(extern int x;
)。这样,file2.cpp
中的x
就指向了file1.cpp
中定义的那个全局变量,它们实际上是同一个变量。但是,需要注意的是,extern
声明不能出现在函数内部,它必须位于所有函数之外的全局作用域中。
总结来说,extern
关键字用于在多个文件中共享同一个全局变量的声明,而如果不使用extern
,则每个文件中的同名全局变量都是独立的。
4. 全局数组和局部数组的初始化
全局数组
- 定义位置:全局数组是在函数外部定义的,即它们对整个程序可见。
- 初始化:
- 如果没有显式初始化,全局数组(包括静态数组)的元素会自动初始化为0(对于基本数据类型,如int, float等)。这是因为全局变量和静态变量的存储区域在程序的数据段(data segment),未初始化的全局变量会被编译器自动初始化为0。
- 如果显式初始化,则可以指定数组元素的具体值。
- 生命周期:全局数组的生命周期贯穿整个程序执行期间,从程序开始执行到程序结束。
局部数组
- 定义位置:局部数组是在函数内部定义的,其作用域限定在定义它的函数内部。
- 初始化:
- 如果不显式初始化,局部数组不会自动初始化为0,它们的初始值是未定义的(即它们包含垃圾值)。
- 如果显式初始化,可以指定数组元素的具体值,或者通过初始化列表进行部分或全部初始化。
- 生命周期:局部数组的生命周期从它被定义时开始,到包含它的函数执行结束时结束。
5. 指针和引用的区别
代表意义
- 指针:是一个变量,存储的是另一个变量的地址。指针可以指向任何类型的数据,包括数组、结构体、函数等。
- 引用:是变量的别名,必须在声明时被初始化,且一旦与某个变量绑定后,就不能再改变为另一个变量的引用。
内存占用
- 指针:占用内存空间,用于存储被指向变量的地址。指针的大小取决于系统架构(如32位系统下通常是4字节,64位系统下通常是8字节)。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C/C++面试必考必会 文章被收录于专栏
【C/C++面试必考必会】专栏,直击面试核心,精选C/C++及相关技术栈中面试官最爱的必考点!从基础语法到高级特性,从内存管理到多线程编程,再到算法与数据结构深度剖析,一网打尽。助你快速构建知识体系,轻松应对技术挑战。希望专栏能让你在面试中脱颖而出,成为技术岗的抢手人才。