C语言可谓是因为指针而拥有了其他的语言所不拥有的作用,但是却又因为指针导致它对于初学者而言是一个很难克服的难题。接下来我们直切主体——指针。
先来看看指针的定义:int *p
解释一下:可以将指针就是在各种基本类型的基础上派生出来的类型。
玩指针有几个问题需要搞明白下面来仔细的解释这几个问题。
int *p //类型为int * int *p[] //类型为int * [] int (*p)[] //类型为int (*)[] int *(*p) // 类型为int *(*p) int *(*p)[] //类型为int*(*p)[] int (*p)(int) //类型为int (*)(int)
有什么规律,相信大家已经心里有数了。没错就是将指针的变量名直接去掉就是指针的类型了。是不是很简单,接下来趁热打铁,咱们继续。
int *p //类型为int int *p[] //类型为int [] int (*p)[] //类型为int ()[] int *(*p) // 类型为int (p) int *(*p)[] //类型为int (p)[] int (*p)(int)//类型为int ()(int)
对对对,你的想法是正确的。就是将*和变量名直接去除,所得到的就是指针所指向的数据类型。
懂了这些是不是感觉指针现在不是那么的难了。既然如此那么我们就来几个事例来分析一下吧。
int *p //定义p是一个指向int类型的指针
int *p[] //由于[]比*的优先级高则p先和[]结合,说明p是一个数组,然后再与*结合说明p是一个数组指针,然后再与int结合,说明p是由指向整形数据的指针组成的数组。
int (*p)[] //()的优先级高于[]所以p先于*结合,说明p是一个指针,再与[]结合说明p指向一个数组,再与int结合说明p是一个指向整形数组的指针
int **p //p先与*结合说明p是一个指针,然后再与*结合说明**p指向了一个指针
int **p[][N] //N为常量,p首先与[][]结合说明p是一个二维数组,然后p再次与*结合说明p是一个指向二维数组的指针,然后再与*结合说明它指向了那个二维数组的首地址。
int *p(int) //p先与(int)结合说明它是一个函数,再与*结合说明他是一个指向函数的指针,再与int结合说明它是指向一个返回值为整形的函数。
内容结束,有什么不懂的可以再微信公众号后台留言,谢谢观看。