C语言中 # 和 ## 的用法
# 是 字符串化操作符,定义时用括号代表参数传递,
可以把传入的参数名替换成带双引号的字符串
定义: #define a(b) #a
使用:a(123)
编译时会展开成 "123"
## 是字符串连接符,定义时用括号代表参数传递,
可以把参数在宏定义的字符串末尾连接起来,起到strcat的效果
定义: #define a(b) 123##b
使用:a(123)
编译时会展开成 123123
关键字volatile有什么含义
防止编译器优化,a=1,a=2,a=3不被优化成a=3,强制不读缓存去读寄存器。
读寄存器必须加volatile,因为寄存器的值经常改变,防止读缓存。
多线程任务共享资源必须加volatile,防止编译器优化出现ABA问题。
关键字static的作用是什么
定义静态变量或者函数,静态变量只初始化一次,如果在类里就属于类。
如果不加extern抛出去的话作用域只限于当前文本。其他文本可以定义重名static变量。
最重要的作用还是函数里面用完不回收。
静态变量存放在代码段。
为什么Static变量只初始化一次
静态变量存放在代码段。局部变量存放在栈里。局部变量默认是auto修饰的。
代码段,就是牛。
extern "C"的作用是什么
告诉编译器,文本后面的内容用 c 编译
const有什么作用?
定义常量。常量不能被修改。定义时必须被初始化。
const 定义常量 ,define 也定义常量,
区别在于 define 定义常量是编译器做的字符串替换
const 定义常量是写进只读存储器,放在代码段
什么情况下使用const关键字
修饰函数参数、函数返回值、定义常量、修饰对象。修饰对象时放在类名前后都可以。
修饰指针,常量指针、指针常量。
strlen("\0")=? sizeof("\0")=?
0 2
C/C++中,strlen是逐字符扫描,碰到\0结束。
sizeof是获取参数的内存大小,参数 \0 会保存在代码段常量区,2字节
strlen 和 sizeof 的区别
strlen是<string.h>里面的函数,sizeof是关键字
strlen 逐字符扫描字符串,统计字符个数,碰到 '\0' 结束
sizeof 在编译时求值,根据数据类型得数据占的字节数
C语言中 strcut 和 union 的区别是什么
一个是结构体一个是联合体
联合体共用一块内存空间。对成员变量的修改会导致其他成员的重写。
联合体内存空间的大小要超过最大成员变量的大小,
而且内存空间要能被所有成员变量的大小整除。
联合体可以用来判断系统的大小端。
给一个short,末端放个1,然后16位的 Short 用数组拆成两个 8 位的char,判断高位低位哪边大。
结构体要求每个成员变量的首地址能被该变量的对齐字节整除
而且结构体的大小要能被所有成员类型的对齐字节整除