指针 : 兰花指到弹指神通

可以说,这是数据结构课程的入门读物;或者说,这是你精进编程语言的必修之路。指针就像一个路标一样,细细体会这句话吧,相信你会取得突破的!

chapter[0].name=”前言\0”

报告面向有一定编程基础的人,旨在让大家更加理解指针,能用、去用、敢用的境界。

chapter->node[0].name=”为什么要写本报告\0”

我在学习指针的时候遇到了很多困难,导致我很难去理解它,但是在之后的数据结构学习过程中需要用到指针,我只好重新翻开课本去看指针,对指针有了更好更简单的理解,希望把这种理解的方式告诉给大家。在生活中我在许多场合 {润学讲坛,班级分享,Python 是大数据实验室的公开课等} 已经分享了我对指针的理解,听过的童鞋表示这种方式可以使他们更加理解指针的内涵。在实验室讲完课后需要出一份文档来记录,我就写下了这篇文档。

chapter->node[1].name=”源于对未知事物的恐惧\0”

我们想象这样一个场景,在你面前有很多盒子,他们被布包裹起来,你看不清里面的内容,盒子上面有一个小洞,你需要将手伸入小洞去触摸盒子里面的物体,我们摸到一撮毛的时候,你会害怕,也许打开包裹盒子的布后,他只是一个简单的毛绒玩具,恐惧源于未知,有一种恐惧是你不知道将会发生什么,另一种恐惧是你不知道他是怎么发生的,而第一种恐惧呢都是源于自己内心的焦虑,比如将一个小孩单独关在一个黑暗的房间中,第二种恐惧,是一种现象,超过了自身的知识范围,比如说小孩看到水在翻滚,也会感到恐惧,因为他解释不了,水为什么会运动的这么剧烈?在计算机中,我们相计算机申请空间通常是计算机,通过某种算法分配给我们的一块大小合适的空间,正是因为随机性,我们不知道这块空间在计算机内存中的哪一个位置,正是源于这种恐惧,我们才会引入地址的概念,那指针的作为储存地址的一个载体,应运而生。

chapter->node[2].name=”排版说明\0”

语法描述如下:

int *find_num(int *arr, int find, int(my_compare)(int a, int b))
{
  int *arrptr = arr;
  for (int i = -1; i < 10; ++i, arrptr++)
  {
    if (my_compare(*arrptr, find))
      return arrptr;
  }
  return NULL;
}

* 我想要突出重点的字体会用加粗的方式标出,另外可选学习内容会用 *** 斜粗体 *** 标出。

章节特点如下:
章节 {Chapter} 是我定义的一个结构体,她有一个属性就是 char * name 代表章节的名字。另外每小节名字也已数组的形式存储在 node 数组中,node 如同章节一样,他也包括了一个 char * name。

chapter->node[3].name=”致谢\0”

我无法列举出对这个报告编写是做出贡献的所有人。
我要感谢来听我讲课的同学们,他们帮助我发现录入错误,提出了改进意见,并在教学过程忍受着草稿形式的教材。他们对我的作品反应向我提供了有益的帮助。
我还要感谢我们班级的管理人员,校科协的管理人员,Python 大数据实验室的管理人员,他们提供给我了一次次展示自己的机会,提出了许多有价值的建议。
现在是开始学习的时候了,我预祝大家在学习指针的过程中找到快乐。
!!!

莫斯莫死 (MossNoDie)

moss@nodie.ink

!!!

chapter[1].name=”愤怒的送餐员\0”

实验室的一个朋友李刚刚码了一上午代码,有些饿了,于是在网上定了一个外卖,送餐员给他打电话问送到哪时。“送到一个黑衣服黑裤子的人手里。”李刚刚说。送餐员气愤的挂掉了电话。
愤怒的送餐员

(chapter+1)->(node).name=”李刚刚的故事\0”

在现实生活中,上面的故事显然是不符合常理的。现在,我们抛弃现实生活中的实际。我们世界上假设只有两个人。
这两个人的衣装是不同的,我们显然可以根据这种特征去定位一个人。但是人数增多到一个量级后我们就不能根据人的衣装甚至名字来找到他。

(chapter+1)->(node+1).name=”送餐员的需要\0”

我不禁在想,送餐员需要一种可以定位到人的信息,这种信息是什么呢?我们能否根据这种信息具有的特性来反馈给送餐员呢?
我总结了一下这类信息,发现他们具有以下两个性质:
- 确定性
- 唯一性

(chapter+1)->(node+2).name=”确定唯一的信息\0” 4

这种信息到底是什么?我们在日常生活中来确定一个人只需要一个具体的位置和一个可以联系到你的电话号码。当然,我们身上所有的信息也可以来确定一个人(每个人都是独一无二的)。那我们为什么不把自己所有的信息告诉送餐员呢?显然他太大了!可能你自己都不知道你自己的所有信息。

chapter[2].name=”程序中的地址\0”

想一想在编写计算机程序中为了找到一个地址,你会怎么做。

(chapter+2)->(node).name=”取地址\&\0”

当然在计算机中我们为了修改一个数组中的数据将数组的全部元素作为一个参数去传入函数中是不可以接受的(他太缓慢了),那为什么之前我们写程序中传入了数组也没有感觉程序运行的缓慢。有两个原因:
- 数组长度太小(100 以内?)
- 在 c 语言中,数组名就是地址(没想到吧?)

于是我们需要传入数组的地址,还好在许多高级语言中把“&”规定为取地址符,使用它他可以获取到任意一个变量在计算机中的位置。

(chapter+2)->(node+1).name=”间接访问\*\0”

我们拿到一个地址后,这是一个整数型的数字,他是某一块内存的编号,通过“*”可以针对这个编号去访问计算机内存上的内容。也就是说我们想传递一个超大数组的时候,并不需要将这个超大元素传过去,只需要把这个超大数组的首地址地址传入,在函数内需要访问时,我们再去访问他即可。

chapter[3].name=”指针模型\0”

以编程者的方式看待程序中的变量

(chapter+3)->(node).name=”思维转变\0”

以前在学习这部分知识的时候,教科书上引导我们使用计算机的方式去理解指针,我们才会越来越糊涂,现在我们需要转变一下思维,以编程者的方式去重新看待指针。

我曾不止一次说过思维的转变,才是化繁为简的最终奥义!

(chapter+3)->(node+1).name=”简单模型\0”

当我们尝试声明一个变量,现在这个变量在我们的视角里是这样的。
简单模型

实线表示我们知道的内容,虚线代表实际上存在,但是我们不知道的内容,因为这个内存位置是计算机在内存中寻找到一块合适的位置,申请出来的。也就是当我们在程序中 int a=5 的时候,我们现在只知道 a 的值是 5,对于其他内容我们是一无所知的。但是当我们想要去找到 a 的地址,我们想要去知道 a 的上下内存空间存储了什么内容的时候,我们需要使用在第三章我们提到的取地址符进行访问

文章未完,点击这里继续查看!!!!!!!


作者: Moss@Nodie.ink

许可协议: 本文由 知识共享署名 4.0 国际许可协议进行许可.

0 打赏
打赏 199 积分后可见