c/c++ 零碎知识总结
union
union和结构体的语法类似,但是其成员有 “覆盖” 的特性,整个union占用的内存大小为其最大成员的大小。例如:
#include <stdio.h>
union data{
int n;
char ch;
short m;
};
int main(){
union data a;
printf("%d, %d\n", sizeof(a), sizeof(union data) );
a.n = 0x40;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.ch = '9';
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.m = 0x2059;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.n = 0x3E25AD54;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
return 0;
}
union data的内存占用如图,改变其中小字节的值,会影响大字节的值。
ref:http://c.biancheng.net/view/2035.html
const
使用const描述的变量具备 “不可变性质”,使用const修饰的变量会变为常量,不能重复赋值。
常见const的用法:
// p指针指向的值不可变
const int * p;
int const * p;
// p指针的值不可变
int * const p;
ref:https://www.cnblogs.com/qxj511/p/4965793.html
static
static用于描述 “静态的值”,被static修饰的变量,存放在内存的静态区,而不是在函数栈。这意味着static变量不会因函数结束而被释放。
使用static的几种情况:
-
在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
-
修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。
-
修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
-
不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用 static 修饰。
-
考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。
ref:
https://www.leftpocket.cn/post/cpp/static/
https://www.runoob.com/w3cnote/cpp-static-usage.html