- 联合体和结构体的区别:
- 首先最直观的就是数据类型名称上的区别:联合体union,结构体struct。
- 最大的区别:联合体共用内存;结构体不共用内存。具体来说,联合体里如果有多个联合体成员,整个联合体的内存大小就是该联合体内最大成员的大小,不涉及到字节对齐。结构体里如果有多个结构体成员,整个结构体的内存大小是该结构体成员经过字节对齐后总内存的大小。
- 比如说,联合体里有一个int成员和一个char成员,那么这个联合体的大小就是4个字节;结构体里有一个int成员和一个char成员,那么这个结构体的大小就是8个字节,这里char成员需要与int类型进行字节对齐,所以最终大小是8个字节。
- 联合体有一个很特别的用途,就是可以判断当前系统是大端存储还是小端存储;所谓大端存储,就是高字节数据存储在地址低位,低字节数据存在地址高位;小端存储就是高字节数据存储在地址高位;低字节数据存储在地址低位。
- 通过联合体判断系统大小端的代码如下:
#include <stdio.h>
union {
int num;
char byte;
} test;
int main() {
test.num = 0x01020304;
if (test.byte == 0x04) {
printf("当前系统是小端序\n");
} else if (test.byte == 0x01) {
printf("当前系统是大端序\n");
} else {
printf("无法判断系统的字节序\n");
}
return 0;
}
- static是什么?有什么作用?
- static是一个C语言关键字,用于控制变量或者函数的存储位置和作用域。
-
static修饰局部变量。如果直接声明一个局部变量不加其他修饰,该变量会存储在栈中,随函数调用结束而被销毁。用static修饰局部变量后,该变量存储位置会发生改变,会存储在内存中的.data数据段(静态数据区),该局部变量不会随函数的调用结束而被销毁,其生命周期是整个程序的运行周期。
-
static修饰全局变量。用static修饰的全局变量,其存储位置在内存中的.data数据段,且该全局变量不能被外部文件使用,仅全局变量所在的当前文件可以访问该变量,外部文件无法通过extern等方法来访问。
-
static修饰函数。使用static关键字修饰的函数是一个静态函数,其作用域就是当前文件,该函数不能被其他文件访问调用。
- const是什么?有什么作用?
- const是一个关键字,表示只读。const用于保护数据不被修改和提高代码的可读性。可以应用于变量、指针、函数参数等场景。
-
const修饰变量。用const修饰的变量会存储在内存中的只读区,这个变量会变成常量,是无法修改的,是只读的。
-
const修饰指针。用const修饰指针有两种常见的说法:指针常量和常量指针。指针常量,本质上是修饰一个常量:
const int *p
,p是指向int类型常量的指针,指向的数据不可以修改,但p本身可以修改,可以指向其他地址。常量指针,本质上是修饰一个指针: int *const p
,这里p是一个常量指针,指针本身的指向不可修改,但其指向的值可以被修改。
-
const修饰函数参数。保证传入函数的参数不能在函数内部被修改。