一、指针高级
1、指针变量自定义
①#define P_INT int *
P_INT p, q;
p:是一个int *指针; q:是一个int
②typedef int *pInt_t;
pInt_t p, q;
p:是一个int *指针; q:是一个int *指针
2.二级指针
二级指针就是给地址再取指针,就是被调想要修改主调空间的值,就需要对主调空间类型&,得到指向该类型的指针。
指针的数组,在函数传参时,数组名对应类型为指向元素这个一级指针的指针。
3.void *
void:缺省类型,不能定义void类型变量,void *:万能接收指针,接收任何类型的指针。
memset:内存设置 memcpy:内存拷贝 memcmp:内存比较
4.const关键字
const关键字在定义变量时一定要初始化;const修饰的只读变量p,仅仅指不能通过变量名修改。
5.指针数组
指针的数组:是一个数组,元素是指针;int *a[5];定义了一个数组,数组的数组名a,a包含了5个元素,元素的类型是int *;
6.数组指针
数组的指针:是一个指针,指向整个数组;int (*p)[5];定义了一个指针,指针指向一个数组,数组有5个元素,每个元素都是int;
注意:数组的数组名是指向数组首元素的指针;
二、函数高级
1.指针函数
指针函数是一个函数,返回值为指针类型的函数;被调函数内部返回的指针一般不能是被调函数的局部变量;
2.函数指针
函数指针是一个指针,指针指向函数;函数的函数名是指向函数入口的地址;
注意:函数的函数名的大小为1字节,和void*类型大小一样。
3.递归函数
①递归需要函数反复的调用(入栈,出栈,传参)
②循环不需要的额外开销,有的问题适用递归
4.快速排序:
注:它的思想就是先把数组第一个元素值传给一个自定义变量,然后把第一个元素的指针和最后一个元素的指针传进去,根据比较让指针移动,当pb > key时,就把值交换然后pb不动,就移动pe,依次循环,直到判断条件pb >= pe结束,就把数组排好了。
5.带参宏与不带参宏
①不带参宏
#define PI (3.14)
②带参宏
#define INTCMP(a, b)((a > b)?(a):a:(b))
③带参宏和函数的区别:
带参宏不是函数,不需要入栈、出栈、传参、传递返回值,效率高于函数调用;带参宏是文本展开替换,当调用次数过多时,代码体积较大;
#define INTCMP(a,b) do{\
int ret1 = (a > b ? a : b);\
printf("max = %d\n", ret1);\
int ret0 = (a > b ? b : a);\
printf("min = %d\n", ret0);\
}while(0);