C & C++

C

a.out(assembler output) 最初是一种格式,已废弃,但名称保留下来了1

Clockwise/Spiral Rule2

void (*signal(int, void (*fp)(int)))(int);
c_cpp_clockwise_spiral_rule_1.png

Pointer

指针与指针的相减操作,表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数)。

例如对于 int 类型的指针 p 和 p1 ,p1-p 的意义表示他们之间相隔多少个 int 类型的元素。同样对于其他类型的指针变量之间相减的意义也是一样。

数组名 a 和指针 p 之间有一个不同之处,指针是一个变量,因此,在 C 语言中,语句 p = a, p++ 都是合法的。但数组名不是变量,类似于 a = p, 和 a++ 形式的语句是非法的。

有效的指针运算(其他所有形式的指针运算都是非法的):

  1. 相同类型指针之间的赋值运算
  2. 指针同整数之间的加法或减法运算
  3. 指向相同数组中的元素的两个指针间的减法或比较运算
  4. 将指针赋值为 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 等函数
  • 让内存的管理变得更加简单。内存的分配都会在一块大的内存上,回收的时候只需要回收大块内存就能将所有的内存回收,防止了内存管理混乱和内存泄露问题

Footnotes:

湘ICP备19014083号-1