参考《让你不再害怕指针》
从复合函数整体换元从外层到内层,并且每层从函数调用和赋值来讲肯定有意义,这两个角度理解。前提还是要知道结合的优先级。
int p; //这是一个普通的整型变量
没什么好说的
int *p;
//首先从P 处开始,先与*结合,所以说明P 是一
//个指针,然后再与int 结合,说明指针所指向
//的内容的类型为int 型.所以P 是一个返回整
//型数据的指针
没什么好说的
int p[3];
//首先从P 处开始,先与[]结合,说明P 是一个数
//组,然后与int 结合,说明数组里的元素是整
//型的,所以P 是一个由整型数据组成的数组
int A ;A 是一个int
p[3] = A, 看成赋值语句,那么说明p 是一个 int 数组
int *p[3];
//首先从P 处开始,先与[]结合,因为其优先级
//比*高,所以P 是一个数组,然后再与*结合,说明
//数组里的元素是指针类型,然后再与int 结合,
//说明指针所指向的内容的类型是整型的,所以
//(感觉这句话 理解起来有点突兀,为什么 不是 指向 p[3] 毕竟 …)
//P 是一个由返回整型数据的指针所组成的数组
p[3]看成 整体
int * A ,A就是一个指针,指向int
p[3] = A,看成赋值语句,说明p是一个数组,数组 元素为指针。
合起来: p是一个数组,数组 元素为指针。
int (*p)[3];
(*p)看成 整体
int A[3] 是一个数组,说明A 是一个int [3] 数组,
*p=A ,看成赋值语句,说明 p 指向了A,*p就是 解指针p 可以接受数组 int[3]
合起来: p 指向了一个数组,数组有3个 元素,元素类型为int
int **p;
//首先从P 开始,先与*结合,说是P 是一个指针,然
//后再与*结合,说明指针所指向的元素是指针,然
//后再与int 结合,说明该指针所指向的元素是整
//型数据.由于二级指针以及更高级的指针极少用
//在复杂的类型中,所以后面更复杂的类型我们就
//不考虑多级指针了,最多只考虑一级指针.
没什么好说的
int p(int);
//从P 处起,先与()结合,说明P 是一个函数,然后进入
//()里分析,说明该函数有一个整型变量的参数
//然后再与外面的int 结合,说明函数的返回值是
//一个整型数据
没什么好说的
int * p(int)
int * A; A 是一个int指针
A = p(int) ;看成函数调用赋值语句,那么p 是一个函数 ,返回值为A
合起来: p 是一个函数,接收一个int 型参数,返回值一个 int 指针
int (*p)(int);
(*p) 是一个整体
令 int (*p)(int) = int A(int);
那么 A 是一个函数,函数接收一个int 返回一个int
A = (*p) 看成调用语句行不通,没关系就反过来,
(*p)=A , 看成赋值语句,
p是一个函数指针 ,因为解应用后可以接收A
合起来:p是一个函数指针 ,函数接收一个int 返回一个int
int *(*p(int))[3];
令 int *(*p(int))[3] = int * A [3]
那么A是一个数组 ,数组元素为 int 指针
A = (*p(int)) ,能看成调用语句吧。(因为A是一个数组,函数不能直接返回,这里通过返回指针所以p前面有个*)
p 是一个函数 ,返回一个指针,解引用后,就是数组A
合起来:p 是一个函数,接收一个int 参数,返回一个指针,指向数组,数组有3个元素,元素是 int * 指针
注意 (*p(int)) 里的 * !!!
int * (fun1(int para1,int para2))[4]; ## err
这个 fun1就是 直接返回数组了,但是C/C++ 函数是不能直接返回数组的,(只能用 struct/class 包装,或是使用C++11的std::array。)
int *(* (*p)(int))[3];
p 是一个函数指针,这个函数接收一个int 参数,返回一个指针,指向数组,数组有3个元素,元素是 int *
int (*p(int))[3];
p 是一个函数,接收一个int 参数,返回一个指针,指向数组,数组有3个元素,元素是 int
int ia[3][4]
int (&row)[4] = ia+1 // 这个是对整个数组的引用
int& row[4] = ia+1 // 元素为引用的数组,这个是不存的,编译通不过