C语言的指针

C语言的指针

一、指针的优先级

  括号()的优先级最高,其次是数组[],然后是剩余的*,最后是类型。指针p与优先级高的先结合,对于比较复杂的指针,结合后就视为一个整体temp,然后再与剩下的结合进行分析。

int p;				// p是一个普通的int型变量

// p先与*结合,后与类型结合,所以p是一个指针,指针指向的内容是int型
int *p;				

// p先与[]结合,然后与类型结合,说明p是一个数组,数组里面的内容是int型
int p[3];			

// p先与[]结合,说明p是一个数组,然后再与*结合,说明数组p里面存放的是指针,
//然后与类型结合,说明指针指向的内容是int型,p是一个由返回整型数据的指针所组成的数组
int *p[3];			

// ()的优先级最高,(*p)说明p是一个指针,然后与数组[3]结合,
//说明指针指向的是大小为3的一个数组,然后与类型结合,
//说明指针所指向的数组里面的内容为int型,
//p是一个指向由整型数据组成的数组的指针
int (*p)[3];		

// p先和最近的*结合,说明p是一个指针,然后再与剩下的*结合,
//说明指针p指向的是一个指针,然后与int结合,
//说明指针p所指向的指针(*p)所指向的内容(**p)为int型
int **p;			

// p先于(int)结合,说明这是一个函数,函数的参数为int型,
//然后与外面的int结合,说明函数返回的内容是int型
int p(int);			

// ()的优先级最高,(*p)说明p是一个指针,然后与(int)结合,
//说明指针所指向的内容是函数,函数的参数为int型,
//然后与外面的int结合,说明指针p所指向的内容(*p)是一个函数,
//该函数的返回内容为int型
int (*p)(int);		

// 一层一层的剥开,p首先与(int)结合,说明p是一个函数(这里说了p是一个函数),
//函数的参数为int型,然后与*结合,说明函数返回的是一个指针,然后与数组[3]结合,
//说明是返回的指针指向的是一个数组,然后与*结合,说明数组里面的内容是指针,
//然后与外面的int结合,说明数组里面的指针指向的内容是int型。
//所以p是一个参数为int型并且返回的是一个指向内容为int*型的数组的函数,
//由于int*是指针,指针指向的内容为int型,
//所以p返回的就是一个指向内容为指向内容为int型的指针的数组的函数(太绕了,注意段句)。
int *(*p(int))[3];	
// 这个过于复杂,再来一遍
// 括号里面的内容是一个整体,直接把(*p(int))替换为ptr,那么表达式就变成了
int *(*p(int))[3];	

// 这就简单多了,通过上面的例子可以知道,
//ptr是一个数组,数组里面的内容为指针,指针指向的内容为int型,
//即ptr是一个内容为指向内容为int型的数组
int *ptr[3];		


// 同样通过上面的例子可以知道p是一个函数,
//函数的参数为int型,函数的返回内容是指针
// 下面就把他们结合起来
*p(int);			

// p是一个函数,函数的参数为int型,函数的返回内容是一个指针,
//该指针指向的内容是一个数组,数组里面的内容为指针(该指针指向的内容为int型)
int *(*p(int))[3];	

二、指针的类型

看一个指针的类型,直接把指针的名字去掉,剩下的就是指针的类型。

int p;				// 去掉p,p是一个普通的int型变量
int *p;				// 去掉p,说明指针的类型是int *型
int p[3];			// 去掉,说明p的类型为int [3],是一个普通的数组
int *p[3];			// 去掉p,说明指针的类型是int *[3]型
int (*p)[3];		// 去掉p,说明指针的类型是int (*)[3]型
int **p;			// 去掉p,说明指针的类型是int **型
int p(int);			// 去掉p,剩下int (int),是一个普通的函数
int (*p)(int);		// 去掉p,说明指针的类型是int (*)(int)型
int *(*p(int))[3];	// 去掉p,说明指针的类型是int *(*(int))[3]型

三、指针所指向的类型

要知道指针所指向的类型,把指针的名字和*去掉,剩下的就是指针所指向的类型。注意优先级。

// 去掉p和*,说明指针所指向的类型是int型
int *p;				

// 因为[]的优先级高,所以p先和[3]结合,说明p是一个数组,
//再与*结合,说明这是一个指针数组,所以这里首先将p[3]去掉,
//然后再去掉*,剩下int,所以指针数组p[3]里面的元素所指向的内容为int型
int *p[3];			

// 去掉p和*,说明指针所指向的类型是int [3]型,
//所以指针p指向的是大小为3的int型数组
int (*p)[3];		

// 去掉p和*,说明指针所指向的类型是int *型
int **p;			

// 去掉p和*,说明指针所指向的类型是int (int)型,
//所以指针p指向的是参数为int的函数,函数的返回类型为int型
int (*p)(int);		

// 因为()优先级高,p和(int)结合,说明p是一个函数,
//然后与*结合,说明函数的返回类型是一个指针,所以这里应该直接把(*p(int))去掉,
//剩下int *[3],所以函数p返回的是一个指向int *[3]型的指针
int *(*p(int))[3];

四、参考资料

指针总结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值