c语言指针算术运算,C语言指针算术运算

本文详细介绍了指针在C语言中的算术运算,包括给指针加减整数、指针相减以及指针间的相对位置。通过示例展示了不同类型指针(如int、short、char)进行算术运算时地址的变化,并强调了访问数组边界外的内存的危险性。同时,讨论了void指针的算术运算及其限制,并提到了指针减法可用于确定数组元素的相对距离。最后,指出了ptrdiff_t类型在处理指针差值时的重要性。
摘要由CSDN通过智能技术生成

数据指针可以执行以下几种算术运算:

给指针加上整数;

从指针减去整数;

两个指针相减;

比较指针。

函数指针则不一定。

给指针加上整数

这种操作很普遍也很有用。给指针加上一个整数实际上加的数是这个整数和指针数据类型对应字节数的乘积。

各个系统的基本数据类型长度可能不同,正如1.2.1节所述。表1-5显示了大部分系统的常见长度,除非特别指定,本书的示例会使用这里的值。

数据类型

长度(字节)

byte

1

char

1

short

2

int

4

long

8

float

4

double

8

为了说明给指针加上整数的效果,我们会使用一个整数数组,如下所示。每次pi加1,地址就加4。这些变量的内存分配如图1-7所示。指针是用数据类型声明的,以便执行算术运算。这种自动调整指针值的可移植方法之所以可能,前提就是知道数据类型的大小。

如果这里使用数组的名字,返回的只是数组地址,也就是数组第一个元素的地址。

c21bbe68a577fa55d323049a43144a83.png

在下面的代码中,我们给指针加3,pi变量会包含地址112,就是pi本身的地址:

指针指向了自己,这样没什么用,但是说明了在做指针算术运算时要小心。访问超出数组范围的内存很危险,应该避免。没有什么能保证被访问的内存是有效变量,存取无效或无用地址的情况很容易发生。

下面的代码演示了short和char类型指针的加法操作:

我们假设内存分配如图1-8所示,这里用到的地址以4字节为界。真实的地址可能涉及不同的字节数和不同的字节序。

44430d9677eb896c7e503efa43c69427.png

下面的代码给每个指针加1然后显示内容:

运行后,你应该能得到类似如下的结果:

ps指针增加了2,因为short的长度是2字节。pc指针增加了1,因为它的数据类型长1字节。这些地址可能没有包含有用的信息。

void指针和加法

作为扩展,大部分编译器都允许给void指针做算术运算,这里我们假设void指针的长度是4。不过,试图给void指针加1可能导致语法错误。在下面的代码片段中,我们声明指针并试图给它加1:

下面是警告信息:

这不是标准C允许的行为,所以编译器发出了警告。不过,pv包含的地址增加了4字节。

从指针减去整数

就像整数可以和指针相加一样,也能从指针减去整数。减去整数时,地址值会减去数据类型的长度和整数值的乘积。为了演示从指针减去整数的效果,我们使用如下所示的数组。这些变量的内存分配如图1-7所示。

pi每次减1,地址都会减4。

指针相减

一个指针减去另一个指针会得到两个地址的差值。这个差值通常没什么用,但可以判断数组中的元素顺序。

指针之间的差值是它们之间相差的“单位”数,差的符号取决于操作数的顺序。这和指针加法是一样的,加到指针上的是数据的长度。我们把“单位”当做操作数。在下例中,我们声明一个数组和数组元素的指针,然后相减:

在第一个printf语句中,我们看到数组的最后一个和第一个元素的位置相差2,就是说它们的索引值相差2。在最后一个printf语句中,差值是-1,表示p0在p1前面,而且它们紧挨着。图1-9说明了本例中内存的分配情况。

446f6eada46b8a3698c2c4cdd417c63e.png

ptrdiff_t类型表示两个指针差值的可移植方式。在上例中,指针相减的结果以ptrdiff_t类型返回。因为指针长度可能不同,这个类型简化了处理差值的任务。

不要把这种技术和利用解引操作来做数字相减混淆。在下例中,我们用指针来确定数字中第一个元素和第二个元素中存储的值的差。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值