「C语言指针」原来是这样 我已经完全懂了.老师:真的有点猛
在初学C语言时候,有些同学总会被一些比较长的语句吓到啥啥啥?这写的是啥?很多同学表示:字都认识,就是看不懂.
本文就来带着大家来学习一种超能力,就是看到一种说明语句,就能准确定位语句所描述的内容,或者说当自己需要某一种数据类型的时候,在类型定义的时候,说明语句怎么写,这是作为一个编程者所必备的能力.
既然是分析说明语句,那么第一个知识点显然就是认识说明语句.什么样子的语句是说明语句呢?简单,只要是以类型名开头的语句,你就可以认为它是说明语句.
我们先看最简单的例子: int p; 显然这是定义了一个整型变量p,那么它是怎么来的呢?是什么样的特性决定了我们这样的理解呢?
显然,我们是通过从左往右阅读,看到了数据类型int,心中有数,这是一个整型,然后看到一个名字p,这是一个变量.所以连起来就是定义了"整型变量p".
把这样的思路推广一下,看另外一个例子: int *p; 从左往右,我们也看到了一个类型 int, 往后看到一个*p, 显然*不可能是名字的组成部分,因为标志符只能是由字母数字下划线构成.
所以名字只能是p,而不是*p. 其实在浏览说明语句的时候,只要见到名字结合了*,就可以下结论:这是一个指针!
那么怎么念呢?还是沿袭我们对于简单说明语句int p;的解读:碰到类型就念类型名,碰到*就念指针,碰到名字就念变量.所以就变成了定义了一个"整型指针变量p".
接着语句升级,看例子int **p; 从左往右看,找到的名字依然是p,名字结合了*,所以这也是一个指针,它可以指向某一种类型的数据.
那么,这个指针可以指向什么样子的数据呢?答案是:看剩余部分,其实就是指针的基类型.
对于说明语句int **p; 除了指针标志*和名字p之外,剩余部分是int *,所以这样的指针可以指向的数据类型是int *,可以存放int *类型数据的地址.
那么怎么读呢?按照我们最朴素的情感,依然是从左往右,连起来就是定义了一个"整型指针指针变量p",也可以读作"指向了整型指针的指针",缩写为二级指针.
接着是另一个例子int p[10];我们也可以从左往右看,显然名字还是叫做p,但是出现了新的元素[],它也不是名字的组成部.那么依然可以下结论:只要名字结合了[],那么这就是数组.所以这是"定义了一个长度为10的整型数组p".
让后接着升级:int *p[10].前面我们说名字结合*就是指针,名字结合[]是数组,那么有*又有[]怎么办呢?答案是:看优先级!
根据优先级规则,名字会先结合[],所以这是一个数组,数组中每一个元素可以相当于什么类型的变量来使用呢?依然是看剩余部分(也就是数组的基类型).在这里剩余部分是int *,就表明了这是一个指针数组,只不过里面每一个元素都是一个整型指针.
最后再来一个:int (*p)[10].沿袭前面的思路就很明显了,先找名字,找到名字是p,接着发现名字结合了*,所以下结论:这是一个指针!是一个指向什么类型的指针由基类型决定,它的基类型是int [10],所以这是一个数组指针.
没有错,就是这么简单.其实还有其他的说明语句,比如说函数指针,指针函数,结构体数组,结构体指针等等,碰到的时候或者需要声明某种类型的变量,可以沿用这样的思路去顺藤摸瓜,就会成竹在胸了.
感谢阅读,学习使人强大.