ringa_lee
你的理解有误
int * (*a[5])(int , char * ) a 是一个长度为5的数组, 数组的每个元素是一个函数指针 函数指针的类型 返回值 是 int * , 带两个参数 int , char *
对于函数指针
B (*A)(int , char * ) 括号外的是函数部分, 括号内的是指针部分
对于变量
int *(*a[5]) 其实等同于 int **a[5];
a 是 一个长度为5的数组,数组每个元素是int**
*操作符的结合顺序是从右到左,第二个*要比第一个*先结合,所以要不要括号无所谓
至于表达 指向「长度为5的指针数组」的指针(也就是二维数组中列长度为5的行首指针)?首先想想 指向 {长度为5的数组} 的指针怎么表达
int (*a)[5];// 此时的括号才有意义,没括号,[] 优于 * 结合
a 是指向数组 ,数组的每个元素 是 int
int* (*a)[5];
a 是指向数组 ,数组的每个元素 是 int *
对于这种问题,采取逐步分解的做法int* (*a[5])(int,char*)可以看做是int* F(int,char*),其中F等价于(*a[5])这里F就是一个返回值类型为int*,参数类型为(int,char*)的函数。也就是说*a[5]为一个函数,因为运算符优先级的原因,这里可以写作*(a[5])。那么就是说a[5]是一个函数指针,指向类型为int*()(int,char*)的函数。所以a实际上是一个数组,其有5个元素,每一个元素都是一个函数指针。
int* (*a[5])(int,char*)
int* F(int,char*)
F
(*a[5])
int*
(int,char*)
*a[5]
*(a[5])
a[5]
int*()(int,char*)
a
a是一个数组,包含5个元素,每一个元素都是一个指针,指针指向函数,函数接收int,char*两个参数并且返回int*。简单来讲,a就是一个函数指针数组
int
char*
int* (*a[5])(int,char*);
int* (*F)(int, char*)是定义函数指针类型F, 该函数带来两个参数(int, char*), 返回int*;F a[5]是定义长度为5的数组a,其元素是类型F;
所以实际上是定义了数组a, 长度为5,成员类型为函数指针.
你的理解有误
对于函数指针
对于变量
a 是 一个长度为5的数组,数组每个元素是int**
*操作符的结合顺序是从右到左,第二个*要比第一个*先结合,所以要不要括号无所谓
至于表达 指向「长度为5的指针数组」的指针(也就是二维数组中列长度为5的行首指针)?
首先想想 指向 {长度为5的数组} 的指针怎么表达
a 是指向数组 ,数组的每个元素 是 int
a 是指向数组 ,数组的每个元素 是 int *
对于这种问题,采取逐步分解的做法
int* (*a[5])(int,char*)
可以看做是
int* F(int,char*)
,其中F
等价于(*a[5])
这里
F
就是一个返回值类型为int*
,参数类型为(int,char*)
的函数。也就是说
*a[5]
为一个函数,因为运算符优先级的原因,这里可以写作*(a[5])
。那么就是说
a[5]
是一个函数指针,指向类型为int*()(int,char*)
的函数。所以
a
实际上是一个数组,其有5个元素,每一个元素都是一个函数指针。a
是一个数组,包含5个元素,每一个元素都是一个指针,指针指向函数,函数接收int
,char*
两个参数并且返回int*
。简单来讲,a
就是一个函数指针数组int* (*a[5])(int,char*);
int* (*F)(int, char*)是定义函数指针类型F, 该函数带来两个参数(int, char*), 返回int*;
F a[5]是定义长度为5的数组a,其元素是类型F;
所以实际上是定义了数组a, 长度为5,成员类型为函数指针.