(小白理解)关于指针与数组的关系(详解得多余)(C语言)
相关知识
指针:就是地址。只是将地址形象化地称为‘指针’而已。
数组:一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。如:a[5],则5个数据是:a[0],a[1],a[2],a[3],a[4]这五个数。
PS:下标是从0开始的。
首先我们来回忆一下怎样定义一维数组。
一维数组的一般形式是
类型符 数组名[常量表达式];
指针的定义是:
类型名 *指针变量名。
关于数组和指针的名字定义和类型的使用注意事项就不多说了。与标识符一样即可。
关于指针与数组的关系
先通过一个例子。运行的结果为:
我们来解释一下这个代码。
在第4行是定义整型变量a,b,并初始化;
在第5行是定义指向整型数据的指针变量pointer_1,pointer_2;
(我们可以形象的把pointer_1,pointer_2当成是一个地址)
在第6行是把变量a的地址赋给指针变量pointer_1;
第7行同理;
(我们可以理解为 定义的两个指针变量就是来装a,b的值)
在第8行是要求输出变量a和b的值;
(这是输出原本的值)
第9行也是输出a,b的地址。
(这就是通过地址pointer_1和地址pointer_2,然后通过*号来指向;*pointer_1就是指向地址pointer_1中的值,*pointer_2就是指向地址pointer_2中的值)
接下来就是我们的重点(指针与数组)了
利用一个指针变量指向一个数组元素,如:
结果是这样的:
没错,你没有看错。这两个的结果居然是一样的。这是为什么呢?
PS:其实数组的数组名就是一个地址,也是数组的首地址
所以出现相同的结果也就不足为奇了。还有上面的a[0]是一个元素,必须加上地址符&,而a本身就是一个地址,所以不需要加地址符&。
那么有人想问了,那怎样访问第二个的地址呢? 这问的很好,我们来看看怎样访问第二个的地址。
结果为:
在这里需要注意的是不同的电脑出现的会不一样哦。
就这样,我们成功的访问到了第二个的地址。
第一个&a[1]这样也许没有人不会看不懂,但第二个可能就有点不懂了。
其实p+=1的含义就是让指针(地址)右移动一个,如为减则向左移动一个。再加上*号即可获得第二个的值,如:
结果为:
就这样可以获得第二个地址所对应的值。
接下来就是让人懵中之懵的 指针与二维数组的关系
还是先看一个例子:
结果:
哇哇哇,有人看到这里已经崩了,这又是怎么回事?
让我们来看看:
这是一个二维数组,但数组名是首地址这个仍然没有变,变了的只是从一维变成了二维而已。
然后,取p=*a[0][0]这个的地址应该都明白,因为a[0][0]是这个二维数组的第一个元素,所以,&a[0][0]就是取这个的地址,这应该是很容易明白的。
而*a为什么也是输出的第一个元素的地址,这也许有些人是不明白的。
好,a是首地址是可以理解的吧,然后就是看 ※a了。(用※代替星号)
其实很好理解,我们定义的a是一个二维数组对吧,所以我们都知道 a是一个二维数组,但计算机它不清楚啊,虽然你在之前定义了a是一个二维数组,但计算机是不知道你什么时候用它的,所以这里的这个※相当于是给计算机说明,说明什么呢?说明这是一个二位数组,所以这个※相对于是用来提醒计算机a是一个二维数组的,所以这个※除了这个说明作用外不会参与其他的关系(反正我是这样理解的)。
所以※a也就相当于是二维数组的首地址。
所以再加一个※就可以得到第一个地址里的值了,如:
结果为:
接下来就是懵懵懵了。
如:
结果为:
能看到这里的人也许应该不多了,也许是看到我只是个无名的小白;也许是不想看这么LOW的;也许是早也看不懂已经放弃了。能看到这里的人我想对你说的是:
因为你出生平凡,所以你要飞得更高;生活没有那么简单,所以这点艰辛又算得了什么。尽管你眼中的道路坎坷崎岖,人生跌入低谷理想遥不可及,是要继续如此沉沦选择胆怯逃避,还是振作起来无畏去登峰造极,这一切的一切都看你自己。也许你觉得这世界不公平,但这世界又几时公平过。还不如把你抱怨的时间拿来做有意义的事情。不管做什么都要坚持,梦想并不遥远,也许就隔一道坎,过了这道坎就是成功,但你却因这道坎就放弃了。而放弃后的你总是抱怨不公平,抱怨为什么别人能成功,自己却不行。从此走上了抱怨路。其实,每个人都一样,都要经历艰辛,坚持下去,不放弃。别被生活的外表给欺骗了。
总的来说,你的内心有多么想干一件事,你就要付出相应的干劲。
外面的世界没有你想的那么好,处处充满了”勾心斗角“。
坚强的人做着坚强的事,世界并不会因为你而停止运转。相反,没了你,世界还能轻松点。别什么都认为自己不行,认为不重要就不去争取。你不去争取,别人就少一个竞争对手,如果这样的人多了。去的人的竞争压力会少很多。
所以,师傅领进门,修行靠个人。没有哪一个成功不是在坚持,努力奋斗中出来的。
记住,不是你抛弃了世界,而是世界淘汰了你。
我们继续接着说上面的。
(以下方法是介绍我自己认为好理解的一种方法)
第一个的※a[1][0],应该很好理解。就不说了。
第二个※(a+1),它的意思是:说明了这是一个二维数组,并且是第2行的首地址,可以理解为(※(a+1)+0)(为下面的理解做准备)。里面的括号指的是行,即二维数组的第一个下标。而外面的括号表示地址,后面的+0是将第2行的地址向右移动一个。(※(a+1)+0)等价于※(a+1)。这是同一个地址。
理解了第二行那第三行就很容易了。
或者这样粗暴的理解:
二维数组的地址需要两个括号,里面 表示行,外面的表示列。
看一下他们的地址:结果为:
所以,以上就是小白我对指针与数组关系的凤毛麟角的理解。也许有不对的地方,还望多多指教。希望对大家有用。