数组,函数,指针

1. 指针数组

是数组,是一个存放指针的数组

例1:int  *arr1[3];  //是一整型指针数组,该数组中有3个元素,每个元素均为指向整型数据的指针

           char *arr2[4];  //同理,是一字符型指针数组,该数组中有4个元素,每个元素均为指向字符型数据的指针


注意:[ ]的优先级比*的优先级高,所以,arr先与[ ]结合,形成数组,又因为有个*,所以为指针数组


例2:char **arr3[2];

按照上述的判断方法,arr3先与[ ]结合,形成数组,又因为char **,所以为二级指针数组,即该数组有2个元素,每个元素均为一个二级指针


2. 数组指针

是指针,是指向数组的指针,存放数组的地址


例3:int (*p)[10];

由优先级知,因为有()的存在,p先与*结合,形成指针,所以该变量为指针变量;

此时,把(*p)看做一个变量整体,如a,则原式就变为:int  a[10];该变量为整型数组;

所以两部分结合起来即为数组指针。

在本例中,指针p指向一个有10个元素的整型数组。


注意:在表示为指针时,因为[]比*的优先级高,所以一定要加().


例4:char (*pc)[5];  //该变量为指向具有5个元素的字符数组的指针


例5:int (*p[10])[5];  //数组指针数组

首先,由优先级,p先与[10]结合,所以该变量即为数组

其次,将p[10]看做一个整体,如a,则与变量即为int (*a)[5]

最后,由上述例3可知新的变量int (*a)[5]为数组指针

所以,结合起来,原变量即为数组指针数组。


例6:int *(*p)[10];  //指针数组指针

首先,()的优先级最高,所以p先与*结合,形成指针,所以该变量即为指针

其次,将(*p)看做一个整体a,则原变量变为 int *a[10]

最后,由上述例1知,int *a[10]为一指针数组

所以,原变量即为指针数组指针。


3. 函数指针

是指针,是指向函数的指针,存放函数的起始地址。

函数的地址即为第一条指令的地址,通常函数的地址可以函数名或者&+函数名表示。


例7:void (*pfun1)();  //该变量为函数指针

首先,()的优先级最高,所以pfun1先与*结合形成指针,故该变量为指针

其次,将(*pfun1)看做一个整体a,原变量可看*结合做 void a();

最后,void a()即为函数。

所以,原变量即为函数指针。


例8:void *pfun2(); //指针函数

因为()的优先级最高,所以pfun先与()结合形成函数

然后再与*结合形成指针,故原变量为指针函数。


4. 函数指针数组


例9:int (*p[10])();

该变量为函数指针数组

首先,在()中,[]的优先级最高,所以p先与[]结合形成数组,整体记为a,所以该变量即为数组。

其次,在()中,a与*结合形成指针,(*a)整体即为b,原变量变为int  b()

最后,int b()即为函数

所以,原变量为函数指针数组。


注意:函数指针数组是一数组,数组每个元素存放函数指针,即存放函数的地址,所以可以很多函数集合在一数组中。

           每次调用一个函数,引用一次数组即可实现,因此,函数指针数组可被用作转移表,简化程序代码。


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

是一指针,该指针指向数组,数组每个元素为函数指针,即数组中存放函数的地址


例10:void (*(*pfun)[10])()

首先,在中间的()优先级最高,所以pfun先与*结合,形成指针,故,该变量即为指针。将(*pfun)看做一整体a

其次,原变量变为void (*a[10])(),由上述例9可知,void (*a[10])()为一函数指针数组

所以,原变量即为函数指针数组的指针。




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值