C语言指针
%p以十六进制打印指针变量的值
指针的类型决定
1.解引用可以操作几个字节 2.加1减1可以跨越几个字节.
void*指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进
⾏指针的+-整数和解引⽤的运算。
const如果放在*的左边,const *,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。
const如果放在*的右边,* const ,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。
指针运算
1.指针加减整数:指针会指向新的地址,这个新地址通常对应于原来地址基础上增加或减少指定的字节数,这取决于所使用的数据类型(比如int、char等)的大小。
2.指针减指针
指针减指针的绝对值是指针与指针之间的元素个数
野指针
1.访问未开辟的空间
2.访问已释放的空间
assert()
assert()是一个宏,如果条件不满足就终止程序,如果满足就接着往下执行
可以在#include<assert.h>前加 #define NDEBUG来关闭assert()
对数组名的理解
1.数组名就是数组⾸元素的地址,类型Type *
2. sizeof(数组名) ,这⾥的数组名表⽰整个数组,这个数组名可以是直接有的,也可以是变换得来的
3. &数组名 ,表示的是整个数组的地址,是一个数组指针,类型Type (*) [N]
数组访问元素的原理
arr[N]会被编译器替换成 *(arr+N),也就是根据起始地址和偏移量得到元素地址,然后解引用得到元素,基于这个原理实际上也可以写成 N[arr],很有趣~
数组传参
数组传参形参可以写成指针的形式,也可以写成数组的形式,写成数组的形式底层其实还是指针
1.一维数组
Type [ ] or Type*
2. 二维数组
Type [ ][N] or Type (*) [N]
数组形式底层还是指针,所以必须指明列数
函数指针
Type (*)(type,type...)
函数指针数组
Type (* arr [N] )(type,type...)
回调函数
把函数作为参数传递给另⼀个函数,在特定条件时调用,这就是回调函数。
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
qsort就是用的回调函数cmpar
return value | meaning |
---|---|
<0 | The element pointed to by p1 goes before the element pointed to by p2 |
0 | The element pointed to by p1 is equivalent to the element pointed to by p2 |
>0 | The element pointed to by p1 goes after the element pointed to by p2 |
大于0交换,小于等于0不交换
和c++的sort不一样,c++是回调函数返回false交换,返回true不交换