关于指针与数组的关系(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也就相当于是二维数组的首地址。

所以再加一个※就可以得到第一个地址里的值了,如:
在这里插入图片描述
结果为:
在这里插入图片描述

接下来就是懵懵懵了。

如:
在这里插入图片描述

结果为:
在这里插入图片描述

(以下方法是介绍我自己认为好理解的一种方法)

第一个的※a[1][0],应该很好理解。就不说了。
第二个※(a+1),它的意思是:说明了这是一个二维数组,并且是第2行的首地址,可以理解为(※(a+1)+0)(为下面的理解做准备)。里面的括号指的是行,即二维数组的第一个下标。而外面的括号表示地址,后面的+0是将第2行的地址向右移动一个。(※(a+1)+0)等价于※(a+1)。这是同一个地址。
理解了第二行那第三行就很容易了。
或者这样粗暴的理解:
二维数组的地址需要两个括号,里面 表示行,外面的表示列。
看一下他们的地址:
在这里插入图片描述结果为:
在这里插入图片描述

发布了10 篇原创文章 · 获赞 0 · 访问量 175

猜你喜欢

转载自blog.csdn.net/qq_40458767/article/details/103223948