指针简介(1)

声明:

        本文是阅读周立功老师的程序设计与数据结构后所写,很多内容其实是书中的内容,所以如果您想了解更多这方面的知识,您可以阅读这本书。

 

指针:

        我想对于程序员来说指针并不陌生,尤其是对于经常写驱动程序或者写操作系统的人。而对于我来说,指针是我看程序时经常会用到的。虽然写的不多,但是读的程序还是不少的。因为感觉周立功老师写的这本书真的非常的好。所以这几天打算从新阅读一下,而从新再读这本书,确实有不同的体会。

        我们最常用到的指针是定义一个特定类型的指针变量,从而用这个指针指向特定类型变量的地址,而我们同时又可以通过地址来实现对所指向的变量进行操作,而这种操作我们在向一个函数中传递形参的时候经常用到。而函数的实现方式多为:

int fun(int *c1, int num);

        其中c1就是传递进函数中的形参,同时亦是可以在函数中对其地址中的值进行修改的。

        上面我只是说明了一种指针使用的方式,我想大家看到这样子讲解指针一定会觉得很头大吧。而要更形象的说到指针,那我们就要使用一些例子进行说明了。现在我们假设有一个小岛(这里小岛比喻为整个电脑,因为我们知道电脑的内存有限,所以小岛的面积也是有限的),而我们要将这个小岛建成一个动物园,而动物园有着不同种类的动物,他们体型不同,所以他们所占用的空间也是不同的。例如大象他占据一个double型的长度,而猴子占int型长度,松鼠占char型长度。

        而现在我们需要为这些动物建设楼房在供他们居住。由于他们的体型不同,所以为他们分配的房子的大小也是不同的。而在为他们分配的每一个房子上都有一个房子号例如几号楼几单元几号房间。

        当我们为名字为王1的猴子分配完房子后(1号楼2单元3号室),我们就知道他们地址在哪里了。同时为了方便管理我们会将每个动物的地址放到一个档案楼中,而相同类型的动物的地址放在同一个档案室中(也是一个房间)用于统一整理相同类型户型的房间。

        现在我们来讲解指针就简单一些了,首先我们要为房子里分配动物,然后获得他的门牌号,这里的门牌号就是这个动物的指针了,其中指针就是告知我们在这个地址中有着一个什么类型的动物。其对应于我们的程序为:

int monkey = 12;
int *pMonkey = &monkey;

        其中我们知道有一个叫12的猴子住到了一个房间,而且我们通过‘&’(取地址符)获得了这只猴子的地址,例如猴子的地址为2号楼2单元2号房。之后会将这个地址记录到档案室中,也就是pMonkey中。而当我们想要知道这个地址后,我就可以通过地址轻松的找到这个地址里的猴子是谁了,而对应的程序代码为:

printf("the monkey is %d /n",*pMonkey);

        我们通过‘*’符来获取指针变量的所指向的地址的值。

        这里需要注意的是很多时候指针是要先定义后声明的,而如果你没有声明就去使用就会出现错误。例如我们在档案室中建立一个猴子的地址,但是这个地址并没有对应于某只猴子并且也没有特殊的声明,那么当我们使用这个地址去找猴子的时候就容易发生错误。这里的错误方式用代码表示为:

int *pMonkey;
printf("the monkey is %d /n" , *pMonkey);

        而在程序中当我们定义空指针时常用:

int *pMonkey = NULL;

        即在上面程序中用NULL这个标识来标记这个地址是没有猴子的,所以我们也就不会根据这个地址来寻找猴子了。

 

一维数组:

        讲完指针下面我们用上面的方式讲解一维数组,对于一维数组就像是我们专门为一种动物建立的一个单元,在这个单元中都住着同样类型的动物,并且他们的地址是相互挨着的。

        下面我们同样以一个例子来说明,例如我们要建立一个猴子的单元,而这个单元中一共住着3位猴子,他们分别叫1,2,3。既然这是一个专门为猴子建立的单元,那么这个单元一定在档案室建立一个专门的科室来存放这个单元的地址,这里我们为这个猴子单元命名为monkey_unit。而在程序中我们可以表示为:

int monkey_unit[3] = {1,2,3};

        其中我们在档案室中一个为这个猴子单元命名为monkey_unit了,所以monkey_unit本身就可以代表这个单元的地址了,而更精确的说,则是monkey_unit指向monkey_unit单元中的第一户猴子,而用程序的方式表示为:

monkey_unit = &monkey_unit[0];

        因此当我们想找到第一家,第二家,第三家猴子是谁时有两种方式:

printf("the first monkey is %d /n",monkey_unit[0]);
printf("the second monkey is %d /n",monkey_unit[1]);
printf("the third monkey is %d /n",monkey_unit[2]);
或者
printf("the first monkey is %d /n",*(monkey_unit));
printf("the second monkey is %d /n",*(monkey_unit+1));
printf("the third monkey is %d /n",*(monkey_unit+2));

        从上面看,对于数组我们同样可以对其进行指针操作。其实数组只是另一种形式的指针。

 

二维数组、指针的指针和数组指针:

        一维数组可以比作一条线将各个分离的数据类型串到一起,而二维数组则可以表示为一个面,在这个面上的任意一点都是这种特定类型的数据。同样他们所占用的空间相同,并且相关挨着。

        下面我们同样使用一个例子来说明:

        上面说了我们建了一个猴子的单元,但是我们发现还有很多的猴子没有房子住,所以我们就要为他们将一个楼,这个楼里有多个单元,那么这个猴子楼同样会在档案室中有所记载,我们将这个猴子楼命名为monkey_building,我们现在就可以通过这个monkey_building的来找到一座猴子楼了,但是对于楼中具体哪个猴子叫什么名字我们同样不知道。而要知道具体哪个房间的猴子叫什么名字,我们就要细分到哪个单元哪个房间了。下面我们用程序进行说明:

int monkey_building[2][3] = {{1,2,3},{4,5,6}};

        我们知道了这个猴子楼后如果想要知道其中一个猴子在哪个房间,我们就要知道他的单元号和房间号,也就是二维数组中的横纵坐标了。我说过其实数组就是一种转变形式的指针,所以对于整个二维数组的操作同样可以转化到对指针的操作。而不同于一维数组的地方是这里猴子楼的名称monkey_building表示的这栋楼第一单元的首地址,用程序表示为:

monkey_building == &monkey_building[0];

        而由上面知单元名为该单元首个房间的名,所以有

monkey_building == &monkey_building[0] == &(&monkey_building[0][0]);
*(monkey_building)== *(&monkey_building[0])== monkey_building[0]== &monkey_building[0][0];
**(monkey_building)== *(&monkey_building[0]) == monkey_building[0][0];

monkey_building + 1 == &monkey_building[1] ;
*(monkey_building) + 1 == monkey_building[0] + 1 == &monkey_building[0][1] ;

        从上面可以看出我们可以通过在数组中写入对应的维度的数值来寻找对应的值,也可以通过操作指针的方式来对数组进行操作。

        既然我们可以通过将一维数组转化为指针,那么对于二维数组来说就应该是指向指针的指针了。即我们可以在定义时有下面的方式:

int monkey_unit[3] = {1,2,3};
int *pMonkey_unit = monkey_unit;

int monkey_building[2][3] = {{1,2,3},{4,5,6}};
int **pMonkey_building = monkey_building;

        而有的时候我们会碰到既有数组又有指针的情况,那就是数组指针和指针数组了,这个是两个容易弄混的概念,我们先用一种简单的方式来对他们进行说明。

        所谓的数组指针指的是数组的指针,他的通常表示为指向某某型数组的指针,而这里说到的关键是他是一个指针只指向特定的数组地址。我们以猴子楼为例,所谓的数组指针就是指对于某一个单元的取址,所以数组指针可以表示为int (*)[3] 。其实更简单一点就是对于一个数组取址就是数组指针。

int monkey_building[2][3] = {{1,2,3},{4,5,6}};
int **pMonkey_building = monkey_building;

int (*pMonkey_unit)[3];
pMonkey_unit = &monkey_building[0] = &monkey_building;

        而对于指针数组,我们可以将其理解为指针的数组,既然他是数组,那么他就是多个指针的组合。而用动物园的方式进行说明就是档案室中整齐摆放的各个猴子的地址。所以指针数组可以表示为int *[3] 。而用函数表示为:

int *pMonkey[3] = {&monkey1,&monkey2,&monkey3};

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值