C++语言零基础入门教程:4.12 指针类型的进一步分析--指针类型的声明

3601 人浏览 | 时间: 2016-12-01 21:21:48 | 作者: codexia

    在《C++语言零基础入门教程:4.11 指针类型的初探分析》中,我已经对基本数据类型和指针类型进行了对比分析,让读者有了一个清晰的了解。我们可以了解到,指针是一种间接操作方式的类型。这点和普通的基本类型是有着本质的差别。
    我们前面也了解到,指针需要被赋予意义,所以在声明指针变量的时候,我们需要用一个基本类型来辅助定义指针的类型。
    为了直观具体的认识一下指针类型在编程中的表现,我们来介绍一下指针的语法知识。
    *号是定义指针的类型的符号,就好比int是声明整形类型的变量一样。我们先声明一个变量,确定变量的类型。然后再来对比着熟悉指针变量的声明。

int cjjjs ; //声明一个变量名为cjjjs的变量,这个变量的类型为int
    对比着,声明指针我们可以这样写:
* pcjjjs;//错误
    但是这样是错误的。所以,指针类型确实和普通的基本数据类型是不一样的,4.11节中我们知道指针需要基本类型来辅助定义。当然,更确切的说,指针类型需要一个类型来辅助定义,因为后面讲解的复合类型也是可以辅助定义指针类型的。所以,我们要这样来声明指针变量:
基本或者复合数据类型 * pcjjjs;
    所以定义基本指针变量可以这样:
int * pcjjjs;
char * pa;
short * pb;
unsigned int * pui;
float * pf;
double * pd;
    所以,指针类型需要由【数据类型】+ 【*】两部分来共同决定。所以以上的定义的指针变量中,指针的类型分别是:
int *
char *
short *
unsigned int *
float *
double *
    那么,指针定义中的数据类型可不可以用我们这些定义的指针的类型来定义指针类型呢?当然可以!我们定义一个指向一个指针变量的指针变量,就可以这样定义:
int * * pii;//int *是定义的数据类型,后面的*是定义指针
char * * pcc;//char *是定义的数据类型
short * * pss;//short *是定义的数据类型
unsigned int * * puii;//unsigned int *是定义的数据类型
float * * pff;//float *是定义的数据类型
double * * pdd;//double *是定义的数据类型
    这里说明一下,指针类型定义时,*号可以和前面的类型关键词连在一起,可以不需要空格,当然你也可以空很多个空格。例如:
int* pi;
int *pi;
int   *    pi;
int** pii;
int ** pii2;
int **pii2;
    因为*号和其他字符可以很清楚的区分,所以连起来没有问题的。然而基本类型的定义,如果连起来就不行了。不过可以连续空很多个空格,例如:
intpi;//这是什么东西?
int     pi;//正确
    那么你可能对于直接定义的指针类型还是可以理解的,就是指向一个变量。我修改指针变量的值,就是更改了指针指向的地址。这个好理解。那么指向指针的指针类型,有没有应用的地方呢?或者有没有指向 (指向指针的指针)的指针类型呢?或者可以有更多层次指向的指针呢?
    指向指针的指针类型,使用的非常多,而不是有没有应用的问题。这是我们使用指针灵活的地方之一。而且,这里也是难住很多人的地方。我们之所以这么细致的一点点的引入,就是让你慢慢感受指针的变化,渐渐的轻松的深入灵活的掌握指针,重点就在于理解指针。
    那么有没有指向 (指向指针的指针)的指针类型呢?或者可以有更多层次指向的指针呢?当然有。指针的类型的多层指向可以和维度联系起来。其实多层指针指向定义的指针,就是用来解决多维度的问题的。
    如果是一维的线性问题,只需要指向基本类型的指针就行了。指针通过改变自己的值,就可以得到所有的基本变量的地址,进而操作所有的变量。
    如果是二维的平面问题,比如表格处理。我们如果只用一维指针,我们需要对行列进行转换,最终对应到一维上去。这个叫做降维处理。我们需要自己处理降低维度带来的工作量。比如两行两列,我们还是用一维的思维来处理数据,第一行的两列在前两个,第二行的两列在第三第四个位置。不过这个关系需要我们自己来处理。在存取超过一行的数据的时候,都需要进行行列到一维线性地址的转换。这样处理起来就比较麻烦。既然如此,我们就在二维空间用二维思维来处理二维的平面问题。这就是指向指针的指针类型的用处。
    那么二维思维用的二维指针实际上指向了一个指针,这个指针指向一个地址。如果是表格问题,那么一行就用一个一维指针指向一行的开始,所以多行就有多个一维指针指向对应那一行的起始地址。二维指针就指向一维指针,二维指针指向哪一个指针,也就表示指向了哪一行,然后在这一行上移动,就可以操作这一行的任何列。
    所以,二维指针很巧妙的直接在二维世界中处理了二维的问题,而不需要降低维度处理,这样让问题处理起来变得简单。当然,维度变化处理始终是要处理的,不过我们通过两个指针很轻松的就处理了。二维指针是驾驭在一维指针之上的,二维指针走动一下,表示一维指针移动了一整行。
    同样的道理,在处理三维的问题时,我们将二维作为基础,三维指针驾驭二维指针,二维指针会驾驭一维指针,从而实现三维指针直接处理三维问题,问题处理也就得以简化。当然还有更多维度的处理,都是这样一级驾驭一级来实现的。而这个转换就是这些指针的层级式指向关系迭代解决的,我们没有真正的去处理多维转为一维的工作。
   这也是指针的魅力所在之一。三维一般用在解决三维立体空间问题上,当然还可以是其他三个维度的问题,不一定是空间问题,只要有三个维度都可以。
    从这些语法的分析讲解上,你就可以深刻感受到这些基本的语法却蕴含着非常牛逼的思想。如果你只是学习下语法,是根本感受不到的,更别说喜欢了,也不要说能够运用的非常灵活巧妙了。
    那么本节就讲到这为止,请多理解指针类型的声明,包括基本的声明写法和指针类型多维指针的内在思想,如果你感受到了指针的灵活和强大,一定可以激发你进一步深入学习指针的欲望,那么你离大神也就更近了一步。
请微信扫码阅读
为防止恶意爬虫,
已开启反爬机制