指针系列易混淆概念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tian_Luo_Girl/article/details/79187565

1.指针数组

这样类似的名字,前边的词是作修饰,后边的词表示类型
指针数组,是一个数组,存放指针的数组
int *arr1[10];
char *arr2[4];
char **arr3[5];

都是指针数组,因此[]优先级高,所以变量名先和[]结合,确定了变量的类型是数组,然后明确数组的内容,是int *,还是char *,还是char **

2.数组指针

是一个指针,它指向一个数组
int (*p)[10];
p先和星结合,确定了变量的类型是指针,然后确定指针的类型,是int [10],是一个可以指向有10个整型元素的数组的一个指针

3.函数指针

指向一个函数的指针,可以通过函数指针调用函数,它指向的其实是函数的入口地址
√void (*pfun1)();
注意啦,只有*先和函数名结合,才是函数指针
下面这个就不是
× void *pfun();
这个是一个返回void*类型的函数

一个有趣的表达式:(*(void (*)())0)();
乍一看,整个人都傻眼啦。
细细分析:从0开始看,(类型)变量,明显是一个强制转换,(void (*)())0,与之相对应,先看0前边括号里的,(void (*)()好像是一个函数指针,将上边的例子的pfun1去掉,不就是这个表达式么,原来是把0强制转换成了函数指针类型,然后又使用函数指针调用了函数

4.函数指针数组

类比指针数组,函数指针数组是一个数组,数组的每个元素的类型是一个函数指针
int (*parr[10]])();
parr先和[]结合,明确了类型是一个数组,然后剩余部分明显是函数指针,因此parr是一个函数指针数组

用途:转移表

5.指向函数指针数组的指针

肯定是一个指针,指向一个数组,数组的每一个元素都是一个函数指针

int *p;//普通指针
int (*p)[10];//数组指针
int (*p)();//函数指针
int (*p[10])();//函数指针数组
int (*(*p)[10])();//指向函数指针数组的指针

猜你喜欢

转载自blog.csdn.net/Tian_Luo_Girl/article/details/79187565