博客开了这么久,都没写什么技术性的文章,恰好最近在看C语言相关的东西,学会一些关于指针声明的小技巧,记录一下。
言传我也不太说话,直接意会吧
变量指针
int *p = NULL; // 指向 整形变量 的指针
int **p = NULL; // 指向 整形指针变量 的指针
常量指针,常指针
const int *p = NULL; // 指向 整形常量 的指针
int *const p = NULL; // 指向 整形 的常指针
const int *const p = NULL; // 指向 整形常量 的常指针
数组指针,指针数组
int *p[4] = {NULL}; // 大小为4的数组,每个元素都是指向整形变量的指针
int (*p)[4] = NULL; // 指向 一个大小为4的整形数组 的指针,自增时每次加4 * sizeof(int)
int *(*p)[4] = NULL; // 指向 一个大小为4的指针数组 ,该数组的每一个元素都是指向整形变量的指针
int *p[3][4] = {NULL}; // 3 * 4的二维数组,每一个元素都是指向整形变量的指针
int (*p)[3][4] = NULL; // 指向 大小为3 * 4的二维整形数组 的指针,自增时每次加3 * 4 * sizeof(int)
int *(*p)[3][4] = NULL; // 指向 大小为3 * 4的二维整形指针数组 的指针,该数组每一个元素都是指向整形变量的指针
int (*(*p)[3])[4] = NULL; // 指向一个指针,这个指针又指向一个大小为3的指针数组,数组的每一个元素指向一个大小为4的整形数组
int *(*(*p)[3])[4] = NULL; // 指向一个指针,这个指针又指向一个大小为3的指针数组,数组的每一个元素指向一个大小为4的整形指针数组
函数指针
int *p(int) = NULL; // 有一个整形形参,返回值为整形指针的函数
int (*p)(int) = NULL; // 指向 有一个整形形参,返回值为整形变量的函数 的函数指针
int *(*p)(int) = NULL; // 指向 有一个整形形参,返回值为整形指针的函数 的函数指针
int *(*p)(int*) = NULL; // 指向 有一个整形指针参数,返回值是整形指针的函数 的函数指针
int *(*p)(int, int*) = NULL; // 指向 有一个整形参数,一个整形指针参数,返回值是整形指针的函数 的函数指针
混合
int *(*(*(*p)(int*))[3])(int*[ ], int*) = NULL; // P是一个函数指针,指向一个有一个整形指针参数的函数,这个函数的返回值是指向数组的指针,数组的每一个元素也是一个函数指针,指向一个 返回值为整形指针,参数为一个整形指针数组和一个整形指针 的函数
分析
稍微有点乱,但是,不难发现其中的规律。
*p表示一个指针,但是 * 符号的优先级没有( )和[ ]高。所以 int *p[ ] 和 int (*p)[ ] 就有一些区别了,一个是 指针数组,一个是数组指针
int *p[ ]; [ ]优先级比*高,所以p是数组,那么把p[]用手遮住,剩下的就是数组的类型了,也就是int*,整形指针类型。
int (*p)[ ]; *p被括号括起来了,优先级最高,所以p是指针,用手把*p遮住,剩下的就是指针所指向的类型了,也就是int [ ],整形数组类型。
那么,同样的方法,可以分析一下其他的声明。如int *p(int);和int (*p)(int);
int *p(int); 乍一看像一个指针,但是这是一个函数声明,( )优先级比[ ]高,所以p是一个函数,所以把p(int)遮住,剩下int*,所以p是一个参数为整形,返回值为整形指针的函数。
int (*p)(int); 这个就是一个指针声明了,p是指针,遮住(*p),剩下int (int),所以p指向 一个参数为整形,返回值为整形 的函数。
方法就是这么个方法,其他分析自己多思考吧。