指针算数运算在数组中的应用

一、指针算数运算
我们已经了解到,指针加上一个整数的结果是另一个指针。但问题是,它指向哪里呢?如果将一个字符指针加1,运算结果产生的指针指向内存中的下一个字符。float占据的内存空间不止1个字节,如果将一个指向float的指针加1,将会发生什么,它会不会指向该float值内部的某个字节呢?
接下来我们通过指针在数组中的应用进行假设:
这里写图片描述
请看下面这些声明:

int arr[10] = {1,2,3,4,5,6};
int *p = arr;
*p = 10;
p++;
*p = 20;

假设1:指针加1表示加一个字节(该假设最终不成立,我下面写了这么多是为了具体解释一下内存和变量的关系)
通过上面的声明我们可以精确的计算出p+1的具体值,倘若假设成立,我们则要对数组里的存储的数值做以下调整,具体调整思路如下:
这里写图片描述
(1)数组初始化时,将数组的前6个元素依次赋值为1,2,3,4,5,6。接下来定义了一个指针变量p,指向数组元素的首地址,第3条语句对指针变量p所指向的内存中所保存的值进行重新赋值(即把10保存在arr[0]中)。
(2)假如我们的假设成立,p+1表示指针加一个字节,即指针变量向后移动一个字节,起初arr[0]为一个整型数据,包含了4个字节,每个字节包含8个位,即arr[0]占了32个位,我们将内存放大来看,在执行*p=10的操作时,10这个数值保存在了占4个字节,32个位的内存地址中,我们将位简化表示,4个位可以用一个16进制数代替,32个位,也就需要8个16进制数表示,每两个16进制数占一个字节。
(3)遵循“低地址保存低位”的原则,10的16进制数值为a,因而第一个格子里的数据为0a,其余位置用0填满,假设p+1表示指针加一个字节,即指针变量向后移动一个字节,接下来*p=20这条语句我们按照同样的方式处理,得到地址为101的框内数据为14(20的16进制数值),其余位置继续用0填满。当我们对指针变量p解引用时,我们最终的结果便是绿色框里所有数据所表示的16进制数(按照低位低地址的存储原则,重新调整顺序为140a),最终计算结果*p=20,arr[0]=5130。
(4)我上边已经提到过,指针的加法显然不是这么回事,因为这样做没有任何意义,并且出现的结果让人难以捉摸。因而假设不成立,要想让假设“成立”,我们可以参照下面声明:

#include"stdio.h"
int main()
{
    int arr[10] = {1,2,3,4,5,6};
    int *p = arr;
    *p = 10;
    p = (int *)((char *)p+1);
    *p = 20;
    printf("*p=%d\n",*p);
    printf("arr[0]=%d",arr[0]);
}} 

运行结果如下:
这里写图片描述
假设2:指针加1表示加整个数组的长度
这种假设毫无意义,因为我们定义使用指针的目的是对数组进行操作,这样的加法操作不是计算机语言开发设计者所想看到的,当然也不是我们理想中的指针算数运算。
假设3:指针加法是加数组的一个单元格(即指向数组下一个单元格)
经过长时间的讨论分析,我们最终得到了这个假设。这个假设无论是从指针变量设计的初衷,还是从指针变量的操作来看,都是最实用、最直接的指针算数运算方式。
总结:指针的算数运算在数组中的操作对象是数组的单元格,指针加上或是减去一个数值,本身都需要调整。
调整的方法具体是:调整的权重为指针去掉一个*号,然后对剩下的数据类型求sizeof。
今天的分享就到这里,下次我们继续探讨各种数据类型的指针进行算术运算的具体规则和基本应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值