1.指针数组和数组指针
int (*p)[10]; 是数组指针,表示指向长度为10的一维数组;
int *p[10]; 是指针数组,表示有10个指针的数组;
当一个指针数组作为实参传递时,对应的形参应该是指针的指针(指向指针地址的指针):**p;
给 **p传参时要穿地址,&s,如果是数组,传:&s[ i ]或s + i;
2.二维数组指针
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p = a; ————此时指针p指向二维数组a的首元素地址,也就是第一行;
p + 1; ————此时p + 1表示指针p所指的地址进入到了二维数组a的第二行;
二维数组指针在传参时,要求返回值一样,基类型一样;
*(a + i) <=> a[ i ] <=> &a[ i ][ 0 ]
*(a + i) + 1指向 a[ i ][ 1 ]的地址;
*(*(a + i) + 1)指的是a[ i ][ 1 ]的值;
a <=> &a[ 0 ];
a + 1 <=> &a[ 1 ];
例题:
int a[ ][ 4 ] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n", *((int *)(a + 3) - 5));
a + 3 加到了数组a的外面;
强转为 int *,此时再 - 5减的是 int 型,4个字节,就会从数组a的外面减到a[ 1 ][ 4 ];
最终输出打印结果为a[ 1 ][ 4 ]的值,为8;
3.函数指针
函数的函数名就是该函数的入口地址;
回调函数:
函数指针的作用是降低程序的耦合性;
4.字符串和指针
定义:char *string = "hello world";
字符串指针打印:
字符串指针互换:
字符串指针逆序:
字符串指针排序:
字符串指针二分查找法:
5.系统的快速排序法qsort