作者 青鸟

在C++中指针的声明可以变得十分复杂,比如char *(* c[10])(int **p);int (*(*(*pfunc)(int *))[5])(int *);在处理这种复杂的声明的问题的时候,我们可以遵循以下这几个规则,来帮助我们更好的理解变量的声明。

  1. 首先应当找到声明的是哪个变量,这个是最重要的

  2. 根据结合顺序() > [] > *根据这个顺序来依次结合

  3. 从内到外逐步来分析

先看几个基础的类型

int* f();

f是一个函数,它的返回类型是一个指针,指针类型是int*

int (* f)();

f是一个函数指针,它指向的函数的返回值是int类型,程序中的每个函数都位于内存中的某个位置,所以存在指向那个位置的指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# include <stdio.h>
int Max(int, int); //函数声明
int main(void)
{
int(*p)(int, int); //定义一个函数指针
int a, b, c;
p = Max; //把函数Max赋给指针变量p, 使p指向Max函数
printf("please enter a and b:");
scanf("%d%d", &a, &b);
c = (*p)(a, b); //通过函数指针调用Max函数
printf("a = %d\nb = %d\nmax = %d\n", a, b, c);
return 0;
}
int Max(int x, int y) //定义Max函数
{
int z;
if (x > y)
{
z = x;
}
else
{
z = y;
}
return z;
}

上面就是一个函数指针的实例

int* (* f)();

f是一个函数指针,它指向的函数的返回值是指向int类型的指针

int *f[]

f是一个数组,该数组每个元素都是指向int类型的指针

int (*f)[10]

f是一个指针,指向一个int类型的数组,该数组有十个int类型的值

int (*f[])();

是一个数组,数组元素的类型是函数指针,函数的返回值是一个整型值

int *(*f[])();

f是一个数组,数组元素的类型是函数指针,函数的返回值是指向 int 类型的指针

int (*(f)(int))[5];

首先f是一个函数指针,接受一个int*参数,函数的返回值是一个指针,这个指针指向一个具有5个元素的数组,数组的类型是int

复杂的类型

下面给出上面两个复杂的解释

char* (*c[10])(int **p);

c[10]是一个具有10个元素的指针数组,指针指向一个函数,接受一个参数int**,返回类型为char *

int (((*pfunc)(int *))[5])(int *)

首先f是一个函数指针,接受一个int* 参数,函数的返回值是一个指针,这个指针指向一个具有5个元素的指针数组,数组的类型是int*,该数组的每一个元素都是一个指针,此指针指向一个函数,该函数的参数为int * ,返回类型为int

char* (*(**foo [][8])())[];

foo是一个二维的指针数组,指针指向一个函数,函数的返回值是一个指针,指针指向一个指针数组,指针里的每一个元素都是一个指向char类型的指针



参考文献:
分析C语言复杂指针函数指针及其定义和用法,C语言函数指针详解