C语言-----对指针和数组的一些认识

本文探讨了C语言中让人困惑的指针概念,揭示了指针的本质。同时,文章指出数组与指针虽然有相似之处,但本质上并不相同。通过对两者关系的解析,帮助读者深化对C语言中这两个重要概念的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针,什么叫指针?

数组,什么又是数组?
指针与数组之间的关系?

这是一个曾经让我感到难于上青天的问题抓狂

现在我来替我解答一下,也希望可以帮助到曾经和我一样绕不清的小伙伴。


指针

在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过指针能找到所需要的变量单元,可以的说,地址指向该变量单元。因此,将地址形象化为指针,意思是通过它能找到以它为地址的内存单元。简单的说:指针就是变量,用来存放地址的变量。 存放在指针中的值都被当成地址处理。

我们来看一下示意图:
上图所示,我们把p成为指针变量,p里所存储的内存地址成为p所指向的内存。指针变量p 里存储的任何数据都将被当做地址处理。

可以这么理解:
※ 一个基本的数据类型加上 * 号,就构成了指针类型,指针类型大小是一定的,与 * 号前面的数据类型无关。
  * 号前面的数据类型只是说明指针所指向的内存里存储的数据类型。
  在32位系统下,不管什么样的指针类型,其大小都是4字节。 printf("%d\n", sizeof(void *)); 打印结果是 4 。
数组:

数组是一组相同类型元素的集合。
int arr[5];

这是定义了一个数组,其中包含了5 个int型的数据。
当我们定义一个数组时,编译器会为其分配一块内存,并把这块内存命名为arr ,arr[0],arr[1]...是数组的元素,不是数组的名字,数组的每一个元素是没有名字的。
特别说明:sizeof(arr[5])的值在32位系统下的值为4,这是因为sizeof是关键字,不是函数,关键字求值是在编译的时候。其实并不存在arr[5]这个元素,也并没有真正去访问arr[5],而是仅仅根据数组元素类型来确定其值,所以这里使用arr[5]不会出错。

指针与数组间的关系:

指针就是指针,在32位系统下,指针变量永远占4个字节,存的是某内存地址。指针可以指向任何地方,但不是任何地方都可以通过这个指针变量访问到。
数组就是数组,其大小和元素个数及其类型相关。数组可以存任何类型的数据,不能存函数。
char *p="abcdef";
char arr[]="abcdef";

上述是第一个先定义了一个指针变量p ,占4 个字节,p里存的是一块内存的首地址,这块内存在静态区,其大小为7个字节,没有名字。我们现在要读取e这个字符,有以下两种方式:
以指针的形式:*(p+4) ,先取出p中存放的地址值,加上4得到新的地址值,然后在解引用。

以下标的方式:p[4],编译器会解析成以指针的形式,先取出p中存放的地址值,加上4得到新的地址值,然后从新的地址中取出值。
两种方法本质上没有什么区别。

第二个定义了一个数组arr,拥有7个char类型的元素,大小为7。这个也有两种访问方式:
以指针的形式:*(arr+4) ,arr代表的是数组首元素的首地址,在加上4 ,得到一个新地址,在解引用取出值。

以下标的方式:arr[4],编译器会解析成以指针的形式,arr作为数组首元素的首地址,加上4,计算出新的地址,然后取出值。
4指的是4个元素。

其实数组与指针本身并没有关系,只是比较相似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值