c++复杂指针

一、数组指针(行指针)

1、定义

数组指针是“指向数组的指针”的简称。首先它是一个指针,接着它指向一个数组。

int (*p)[n];

2、解析

()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长,也就是说执行p+1时,p要跨过n个整型数据的长度。

二、指针数组

1、定义

指针数组是“保存指针类型变量的数组”。首先它是一个数组,接着数组的每一个元素都是指针。

int *p[n];

2、解析

[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素(数组的每一个元素都是一个指针)。这里执行p+1时,则p指向下一个数组元素。

三、函数指针

1、定义

函数指针是指向函数的指针变量。因而“函数指针”本身首先应是指针变量,只不过指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。

C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

2、格式

返回值类型 ( * 指针变量名) ([形参列表]);

“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数申明,申明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

3、复杂函数指针识别

1)int (*func)(int *p);

func的外面有一对圆括号,而且左边是一个号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int类型的形参,返回值类型是int。

2)int (func)(int *p, int (*f)(int));

func被一对括号包含,且左边有一个号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int 和int ()(int)这样的形参,返回值为int类型。再来看一看func的形参int (f)(int),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。

int (*func[5])(int *p);

func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个,说明func的元素是指针,要注意这里的不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比高,func先跟[]结合,因此修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。

int (*(*func)[5])(int *p);

func被一个圆括号包含,左边又有一个,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

int (*(*func)(int *p))[5];

func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

4、简单函数指针应用

#include <iostream>  
using namespace std;  

//求最大值函数  
int Max(int x,int y)  
{  
    if(x>=y)  
        return x;  
    else  
        return y;  
}  

//求和函数  
int sub(int x,int y)  
{  
    return (x+y);  
}  

//求差函数  
int minus(int x,int y)  
{  
    return (x-y);  
}  

//函数指针  
void test(int (*p)(int,int),int a,int b)  
{  
    int ptr;  
    ptr=(*p)(a,b);  
    printf_s("a=%d,b=%d,c=%d \n",a,b,ptr);  
}  

int main()  
{  
    int a=1,b=2,c;  
    test(Max,a,b);  
    test(sub,a,b);  
    test(minus,a,b);  
    return 0;  
}

结果:2,3,-1

四、指针函数

1、定义

指针函数就是返回值为指针的函数,本质上是一个函数,我们都知道函数都有返回类型,而z指针函数它返回的是某一类型的一个指针。

类型名 *函数名(函数参数列表);

2、解析

其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数返回值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址)。

“类型名”表示函数返回的指针指向的类型”。

“(函数参数列表)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。其示例如下:

int *pfun(int, int);

由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。即:

int *(pfun(int, int));

接着再和前面的“*”结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值