指针、数组、函数这三个词语混搭浅析

1.指针与数组

指针是指针、数组是数组,它们之间没有一点关系。

指针就是地址,在32位平台下,永远是4个字节;数组就是数组,是同类型的元素的集合。

2.指针数组与数组指针

我们先来看两个例子:

int *p[5];

int (*p)[5];

我们怎么区分上面两个变量到底是数组指针还是指针数组呢?

答案:优先级

我们可以通过看变量名p,变量P先跟谁结合就是什么。

[ ]的优先级高于*,所以对于第一个定义int *p[5],首先确定它是数组,然后把p[5]拿开后剩下int *,所以这个数组里存的是整型指针。

总结:这是一个内部含有5个整型指针的数组。


接下来看一下第二个int (*p)[5];

首先它是一个指针,然后把(*p)拿走,剩下int [5],所以这个指针指向的是整型数组。

总结:这是一个指向一个整型数组(含有5个元素)的指针。


通常我们定义一个元素的时候,都是以类型+变量名的形式,例如: int a=0;  定义一个整型变量;char *p=NULL;定义一个char型指针变量;

所以,我们还可以这样定义:

int(*)[5] p;

其中int(*)[5] 是指针类型——数组指针,p为变量名。p是一个数组指针。

int *[5]  p;

其中int *[5] 为数组类型——指针数组,p为变量名。p是一个指针数组。

3.函数指针

首先明白它是一个指针,指向的是一个函数。它也是一种类型

例:1.char * fun1(char* p1,  char* p2);

2.char( * fun2)(char* p1,  char* p2);

从()*的优先级来看,()的优先级要高。所以第一个是一个函数,它的返回值是char*类型。

第二个,首先知道它是一个指针,fun2不是一个函数而是一个指针变量。去掉( * fun2)剩下char (cha* p1,  char* p2);,所以它是一个函数指针,指针所指向函数的返回类型为char。


函数指针与普通指针没什么差别,只不过指向的内容不同而已。

看一个有趣的例子:

(*(void(*)())0)();

第一步:void(*)(),我们能看出这是一个函数指针,这个函数没有参数,没有返回值。

第二步:用A代替void(*)(),则看剩下的(*(A)0)();A是函数指针类型,我们能发现(A)0,是把0强转成函数指针的意思。此时的0是一个地址。

第三步:用B代替(void(*)())0,则看剩下的(*B)();由于B是一个地址,所以(*B)是对B解引用,取出B里的内容。此时的内容是保存在首地址为0的一段区域内的函数。

第四步:用C代替(*(void(*)())0),则看剩下的C();因为C是一个函数,C()的意思就是函数调用。

4.函数指针数组

首先认为它是一个数组,那么数组里面存放的是什么呢?

数组里存放的是一个个指向函数的指针。

例如:char * (*pf [5] ) ( char * p);

其中pf是这个数组的数组名,里面有5个元素,都是指向函数的函数指针。指向的这个函数返回值为char*(字符型指针)类型,接收的参数为一个指向(字符指针)的函数。


5.函数指针数组的指针

首先,它是一个指针。

例如:char * ((*pf) [5] ) ( char * p);

这里的pf是指针变量,指向的是一个(函数指针)数组,这个数组里面放的是一个个的指针,这个指针又指向的是一个个函数。

看下面示意图理解:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值