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的内存占用如图,改变其中小字节的值,会影响大字节的值。

image

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

posted @ 2022-01-05 16:48  moon_orange  阅读(30)  评论(0编辑  收藏  举报