数组指针
数组指针我们将它理解为指向数组的指针在此之前我们不妨理解一下
&arr 和 arr之间的区别
其实区别很明显:跳跃跨度不同
看图:
我们的arr+1操作后就只跳跃了一个字节长度(因为是char类型)而我们的&arr+1则跳跃了一个数组的大小。
我们的数组指针就是指向&arr的指针
他继承了&arr相同的跳跃能力
创建方法:
使用时我们可以将其当做二维指针使用pa[0][10]就指向arr[10]
而pa[0][10]等价与*(*(pa+0)+10)
指针数组
顾名思义这是一个数组
不过这个数组的元素是指针
指针数组的建立
int main() { char* arr[20] = { 0 }; return 0; }
要注意的点是他的类型和数组指针类型很像
不过要区分也很简单我们只要记住:
变量名和 * 结合的是指针如数组指针就是将 *和变量名结合如char(*pa)[10],这就创造了一个指向10空间数组的指针。
而指针数组
的创建是char *pa[10]这就是创建了一个10个大小的指针数组。
(指针数组可以将相同类型的指针进行打包在传参时又可以节省很多空间)
函数指针
函数也有他的存储地址
Add和&Add两者除类型不同之外,在使用中几乎没有不同。
函数指针的创建
函数指针数组
数组是一个存放相同类型数据的存储空间。
我们已经学习了指针数组,我们类比一下指针数组就可以理解函数指针数组了
函数指针的创建
与函数指针类似在数组名后加上数组大小即可。
指向函数指针数组的指针
我们把函数都打包到函数指针数组我们传递给其他函数时我们依旧需要函数指针数组的指针。
(其实无论是函数指针数组还是指向函数指针数组的指针都是函数数组和函数数组指针的特殊形式而已。)
指向函数指针数组的指针的创建
void test(const char* str) { printf("%s\n", str); } int main() { //函数指针pfun void (*pfun)(const char*) = test; //函数指针的数组pfunArr void (*pfunArr[5])(const char* str); pfunArr[0] = test; //指向函数指针数组pfunArr的指针ppfunArr void (*(*ppfunArr)[5])(const char*) = &pfunArr; return 0; }
当与变量名结合那么这个变量就是指针
当变量名旁有**[ ]时我们的变量名会优先与[ ]结合所以我们要创建指向函数指针数组的指针**时我们需要将变量名和括在一起。
总结
指针进阶远远不止这些博主也不知道会出多少期关于指针进阶。
但作为C语言最重要也最难的内容博主认为出他个7 8 期都是合理的。
OK结束
下一期我会在此理解指针并讲解一下指针的题目。