首页 > 代码库 > 复杂的指针结构应如何理解

复杂的指针结构应如何理解

1. 数组的定义

数组由数组元素的类型,数组名,[]以及数组长度构成。

int a[10] = {0};      //显式的数组长度10int b[] = {1, 2, 3};  //隐式的数组长度3

2. 指针的定义

 C++语言使用*符号把一个标识符声明为指针。

int *p1, *p2;     //p1 and p2 point to an intstring *pstring;  //pstring points to a string

 

3. 函数指针的定义

函数指针由标识符,返回值,参数列表组成

void (*funcPtr)(int, int);

阅读这类复杂的声明时,通用的方法是:从中间开始,依次向两边展开。

从中间开始是指,从变量名称开始,在这个例子中也就是funcPtr。然后去变量右侧寻找最近的元素(无),然后去左侧(*,表示funcPtr是一个指针),然后右侧((int, int),参数列表),然后左侧(void,返回值)。所以funcPtr是一个指向参数列表为(int, int),返回值为void类型函数的指针。

下面再看一些复杂的例子:

void *(*(*fp1)(int))[10];

fp1临近右侧无,左侧*,所以fp1为指针,右侧紧跟参数列表(int)表明fp1是函数指针,且函数的参数列表为(int), 所以其余部分应为函数返回值,若用fp_ret来简化,则可表示为:

void *(*fp_ret)[10];

fp_ret是一个指针,指向长度为10的数组,数组中的元素类型为void*。所以综合起来就是:fp1是一个函数指针,其指向的函数具有一个int类型的参数,且返回值为一个指针,该指针指向一个有10个void*元素的数组。 

typedef double (*(*(*fp3)())[10])(); fp3 a;

fp3是一个函数指针,其指向的函数参数为空, 返回值是一个指针,指向长度为10的数组,数组元素是参数列表为空返回值为double类型的函数指针。

复杂的指针结构应如何理解