一、位操作
第n位清0:
a & (0x1<
第n位置1:
a | (0x1<
a为4字节大小,提取a的最低16位,其他位不变
a = a & 0x0000ffff
将a的20为位置置1,其他位保持不变
a = a | 0x00100000
二、格式符
%d一般是表示为32位,表示4个字节
所以%hd表示16位,既表示2字节
所以%hhd表示8位,既表示1字节
无符号用%u
三、ASCII表
0-9:48-57 A-Z:65-90 a-z:97-122
四、函数指针与指针函数
int (*p)(int);
int *p(int);
前者是函数指针,强调的是(P)指向一个函数,并且有一个传参是int型的
后者是指针函数,强调的是(int),定义一个函数,这个函数是一个指针的
回掉函数的用法
测试使用:
/* * 以下是函数指针的使用 */ #include<stdio.h> void *func(int a,int b); void *my_func(void *(*process_func)(int,int),char *ptr,int *data) { char *my_func_str; int data1 = 11,data2 = 22; my_func_str = process_func(data1,data2); printf("\nparent\n"); printf("ptr : %s,\tdata :%d\n",ptr,*data); printf("my_func_str :%s\n",my_func_str); } void *func(int a,int b) { char *ptr="hello my_func"; printf("child\n"); printf("a:%d\tb:%d\n",a,b); printf("%d + %d = %d\n",a,b,a+b); return ptr; } int main() { int data = 1000; char *ptr = "hello linux"; my_func(func,ptr,&data); return 0; }
五、内存分配
参考:https://blog.csdn.net/lewis_kuo/article/details/13020031
在采用段式内存管理的架构中(比如intel的80x86系统),一个程序本质上都是由 bss段、data段、text段三个组成的。
BSS段:BSS段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。一般在初始化时bss 段部分将会清零(bss段属于静态内存分配,即程序一开始就将其清零了)。
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。
栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static局部变量意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
bss段:存储未初始化的全局变量和为初始化的静态变量
data段:存储已初始化的静态变量和已初始化的全局变量
text段:代码段,存储代码
(变量存储在系统中)
六、编译处理过程
- 预处理阶段
还是c语言,只是把内容替换展开,比如#define的内容
gcc -E xxx.c -o xxx.i
- 编译阶段
编译成x86控制语句,c语言编程汇编语言
gcc -S xxx.i -o xxx.S
- 汇编阶段
汇编语言准换成机器语言(01语句)
gcc -c xxx.S -o xxx.o
查看二进制机器码
objdump -d macro.o
- 链接阶段
到库里面去把文件链接处理
gcc xxx.o -o xxx.elf