C & C++
C
a.out(assembler output) 最初是一种格式,已废弃,但名称保留下来了1。
Clockwise/Spiral Rule2
void (*signal(int, void (*fp)(int)))(int);

Pointer
指针与指针的相减操作,表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数)。
例如对于 int 类型的指针 p 和 p1 ,p1-p 的意义表示他们之间相隔多少个 int 类型的元素。同样对于其他类型的指针变量之间相减的意义也是一样。
数组名 a 和指针 p 之间有一个不同之处,指针是一个变量,因此,在 C 语言中,语句 p = a, p++ 都是合法的。但数组名不是变量,类似于 a = p, 和 a++ 形式的语句是非法的。
有效的指针运算(其他所有形式的指针运算都是非法的):
- 相同类型指针之间的赋值运算
- 指针同整数之间的加法或减法运算
- 指向相同数组中的元素的两个指针间的减法或比较运算
- 将指针赋值为 0 或指针与 0 之间的比较运算
void Func(int x) { /* 声明一个函数*/ printf("%d",x); } void (*p) (int); /* 定义一个函数指针*/ p = Func; /* 将 Func 函数的首地址赋给指针变量 p */ (*p)(a, b); /*通过函数指针调用 Func 函数 */
library function
printf() - stdio.h
%5d 5位宽 整型 %+5d 带正负号的5位宽 整型 %-5d 左对齐5位宽 整型 %05d 5位宽,不足补零 整型 %5.2f 显示两位小数点的5位宽 浮点型 %#5x 带前缀的5位宽十六进制 整型
memchr() - mem.h
在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
void *memchr(const void *str, int c, size_t n)
offsetof - stddef.h
linux 宏定义函数 offsetof 是算出 MEMBER 在 TYPE 中的偏移:
/* Offset of member MEMBER in a struct of type TYPE. */ #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
typedef
typedef 关键字用于定义别名。 一般用法:
typedef T Alias;
函数: char *f(int, unsigned, float, const char *)
函数指针: char *(*fp)(int, unsigned, float, const char *)
定义上述函数指针的别名:
typedef char *(*FP)(int, unsigned, float, const char *); FP fp = f; /* define and assign fp point to function f */
类型是 void (*)(int) ,即参数一个int,什么也不返回的函数指针,定义的别名是 fp_t :
typedef char (*fp_t)(int);
把 a 声明为具有 10 个 int 元素的数组的类型别名:
typedef int a[10];
struct
结构体的 {, } 格式只能用于赋值时初始化,即声明并初始化,而不能直接赋值给一个已经声明的结构体变量。或按照 c99 标准先强制类型转换。
array
int a[3][2];
某种意义上是 C 语言是没有列这个概念的严格来讲,C 没有多维数组,只有数组的数组:
- 对于一维数组,比如
int a[2];
,是指连续放 2 个 int - 对于多维数组,比如
int a[3][2];
,是指连续放 3 个 int[2] ,最终效果就是连续放了 6 个 int
memory
使用内存池分配内存有几点好处:
- 提升内存分配效率。不需要每次分配内存都执行 malloc/alloc 等函数
- 让内存的管理变得更加简单。内存的分配都会在一块大的内存上,回收的时候只需要回收大块内存就能将所有的内存回收,防止了内存管理混乱和内存泄露问题