C语言声明指针小结

博客开了这么久,都没写什么技术性的文章,恰好最近在看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指向   一个参数为整形,返回值为整形  的函数。



方法就是这么个方法,其他分析自己多思考吧。

你可能感兴趣的:(C语言声明指针小结)