乡村胡谈C语言指针,初识
2019-08-30

C语言中有一个很奇妙的章节就是指针,学会了感觉真的很爽。但是没有学会的时候那内心真是一种煎熬,痛不欲生。

而我乡村胡的存在就是要带领你走出水深火热。

终于等到了。

 

乡村胡问:我们以前用过的内存卡,这个玩意能干什么?

同学回答:可以存放音乐、图片、小电影...........

同学回答:还可以存种子

某同学问:种子是什么东西?

乡村胡回答:这个问题难倒了我

 

在这里我们要明白图片、音乐这些都被转化成了数字信号存在了计算机里面

 

问:什么是数字信号?

答:就是 0 1 组成的信号,对,其实就是我们的二进制

 

当然在这里我们不讨论图片、音乐、视频这些复杂的东西,涉及知识太多

我们来思考简单的基本数据怎么存放

以前我们就知道char  int   在32位系统中分别占用 1 个字节和4个字节

 

问:什么是字节?

8位组合成的一个整体就是一个字节

又问:什么是位

我们首先知道计算机处理的是数字信号,而数字信号仅仅需要0和1就能表示所有了。我们的内存卡就是由“无数”个最小单元组成的,这些最小的单元只能有两种状态。不一样的存储介质表示方式不一样,但是一样的就是都有两种状态。必须磁盘、光盘、硬盘存储原理都是不一样的,但是每个最小单元都是表示两种状态这个一致,这两种状态分别建立数学模型用1和0来表示。因此简单说来什么位呢,就是能存储一个基本信号的单元,能表示0或者1。

 

问:虽然位时最小的单位,但是我们并把位作为基本单位。为什么呢?

答:你今天出去购物带多少钱,这句话说的多少钱应该值的多少元钱。为什么不是分呢?因为社会进步了,人民币贬值了,所以基本单位变了。比如你问马云有多少钱,可能他的基本单位就是亿了。

 

位和字节学明白才可能学会指针,这里讲一下他们的英文 位(bit)  字节(Byte)   1B=8b  ,因为都是b开头的单词,字节一般用B,位一般用b

 

这时候我们继续研究,计算机会从一个位开始编号,就像学校对每个学生编号一样,这样一来所有的位就有编号了

 

 截取一段画出来,美不美,这里的每一个格子代表一个位。我们给他们编上号从96号-117号。

 因为1B=8b,所以在这里第一个字节就是96-103组成的整体,第二个字节从104-111,第三个字节从112到  未完待续

 

接下来我们就用这块存储空间来搞一点事情,看下面的代码:

 char  a = "A";

字符A的ASCII码为65,char类型 占用一个字节 ,也就是占用编号为96到103这一块存储空间,一共是8位

65的二进制编码为0100 0001,所以就变成这样了:

 

 现在就开始变得复杂了,首先从 96 - 103 这块空间的名字叫做a,里面存储一个"A",其实就是65,二进制位01000001

 重点来了这一个字节由8个位组成也就是有8个编号,到底哪一个办好代表a这个变量,对,就是96

 

问:因为我们进一步思考,如我我们找到96是不是就能找到a?

答案:当然不能,因为我们只找到了起始点,并没有找到终止点

问:怎么才能找到终止点?

答案:知道这个变量占多少个字节就可以了,如果占一个字节,那就从96开始数8个。如果占两个字节那就从96开始数16个。

 

 

因此计算机要找到这个数据必须知道两个要素,第一个要素是该数据的起始点,第二个要素是该数据占多少字节

 

如果有一个东西,恰好能表示这两个要素,那么我们就说能够通过这个东西找到我们要想要的数据。

这就好比我们可以通过你的家庭住址找到你,你的家庭住址就是你的地址,形象描述,你的家庭住址指向你。所以地址的另外一个名字叫做“指针”

因此这一个东西就叫做指针。

 

 

进一步思考,这些编码都是整数。如果我们在计算机中看到一个96,这时候会出现一个新的问题,这个96道理是表示数据96,还是表示96号位置呢?

因此就有了接下来的东西

 

char a;

char *p;

p=&a;

 

这是一个再熟悉不过的代码了,怎么理解呢?

char a=‘A’;   // 这是在定义一个字符变量a,占一个字节 。接上文特定环境,那就是占用96号-103号空间

char *p; // 这个地方要这么看 ,怎么看呢?这是定义一个变量p,它的类型为 char *,欧买嘎!,什么鬼,我慢慢给你到来

 

char *      是一种数据类型,char在这里并不代表字符,而是代表占一个字节。* 号在这里代表的是,改变量用来装地址。准确来讲是一维,先不思考这个问题。那么合在一个char *  p;这个p就应该代表是转存储一个地址,而且范围是1个字节。

 

p=&a;     //&这个是c语言中的取地址符,因此&a就代表取出a的地址,就是96。其实就是p=96,注意只能在大脑想一想,但是不能这么写,因为直接写p=96就炸了。系统为任务96是一个普通数据,报错说普通数据不能赋值给地址。

 

仔细思考 p拿到了96,那么通过p能够准群找到变量a中存储的数据么? 当然能! 因为前文说到了 p的类型  是 char * ,其中的char表明了我这数据占1个字节,此时计算机就能准确从 96找到 103了。

 

回过头看上文,我们说:计算机要找到这个数据必须知道两个要素,第一个要素是该数据的起始点,第二个要素是该数据占多少字节

仔细看一看这个p是不是完美满足

 

此时的p还仅仅具备两个要素,还不能真正的找到数据,要想找到数据还需要另外一个运算符*,叫做取值运算符。

执行语句: b=*p;  

这里的*p就代表里面装的东西了,所以该语句就等价:b=‘A’;

 

 

 

 思考问题:

1.  上文代码中两次不同出现 *p怎么理解?

2.  什么是指针变量,什么变量的指针?

3.  上文中的 p +1 的值是多少?

4.   char  *p  和 int  *p区别在哪里,相同点在哪里?