首页 > 版块 > C语言 > 帖子正文

指针和数组的恩恩怨怨

黄忠 发布于 2022-01-10 13:55
收藏 0 回复 0 浏览 124 原创

指针和数组有没有关系呢?到底有什么关系,今天我们就来好好的看一看。

指针就是指针,指针变量在32位系统下,永远占4字节,其值为某一个内存的地址。指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到呢?

数组就是数组,其大小与元素的类型和个数有关;定义数组时必须指定其元素的类型和个数;数组可以存任何类型的数据,但不能存函数。

既然它们之间没有任何关系,那为何很多人经常把数组和指针混淆,甚至很多人认为指针和数组是一样的呢?我们先来看下吧。

1、以指针的形式访问和以下标的形式访问
下面我们就详细讨论讨论它们之间似是而非的一些特点。例如,函数内部有如下定义:

(A)char *p = abcdef;

(B)char a[ ] = abcdef;

①以指针的形式访问指针和以下标的形式访问指针

以指针的形式:*p+4

以下标的形式:p[4]

这里的4 是偏移量,都是先取出p里存储的地址值,加上偏移量,计算出新的地址,然后从新的地址中取出值。那么上面形式不同,访问的本质是一样的。

②以指针的形式访问数组和以下标的形式访问数组

以指针形式:*a+4

以下标形式:a[4]

我们都知道数组名代表数组首元素的首地址,加上4个元素的偏移量,得到新的地址,然后取出新地址上的值。

由此得出指针和数组都是可以“以指针的形式”或“以下标的形式”进行访问,但是是完全不一样的东西。

还有需要注意的是这个偏移量代表的是元素,而不是字节,偏移元素的个数再计算新的地址取值。

2、a &a 的区别

先来举个例子:

int a[5] = {1,2,3,4,5},b,c;

int *prt = (int *)(&a + 1);

b = *(a+1);

c = *(ptr-1);

对指针进行加1操作,得到的是下一个元素的地址,而不是原有地址值直接加1,所以一个类型为T的指针的移动,以sizeof(T)为移动单位。因此,对上面例子来说,a是一个一维数组,数组中有5个元素,所以&a+1是取数组a的首地址,该地址的值加上sizeof(a)的值,也就是&a+5*sizeof(int),也就是下一个数组的首地址,显然当前指针已经越过了数组的界限。

那么*a+1):a&a的值是一样的,但是意思不一样,a是数组首元素的地址,也就是a[0]的首地址,&a是数组的首地址,a+1是数组下一个元素的首地址,也就是a[1]的首地址,&a+1是下一个数组的首地址,所以b的值应该是输出2*ptr-1),因为前面我们分析ptr是指向a[5]的,并且ptrint*类型,所以*ptr-1)是指向a[4],输出为5

由此我们可以得知数组名a代表的是数组首元素的首地址,而不是数组的首地址,&a才是整个数组的首地址。

指针和数组你能完全理清楚了吗?

 


0 0
发表评论 侵权投诉
评论 (0)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表乌云踏雪网立场。

文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。