减去以下两个包含整数的地址返回 1 而不是预期的 4 [重复]
Posted
技术标签:
【中文标题】减去以下两个包含整数的地址返回 1 而不是预期的 4 [重复]【英文标题】:Subtracting two following addresses that containing ints returns 1 and not 4 as expected [duplicate] 【发布时间】:2022-01-23 01:29:15 【问题描述】:#include <stdio.h>
int main()
int a[5] = 1,2,3,4,5;
int *p = a;
int *q = p++;
int b = p-q;
printf("%d", b);
return 0;
p
指向2
,q
指向1
。
我知道Integer在内存中占用4
字节,所以如果我错了请纠正我,但例如如果a[0]
的地址是1000
,那么a[1]
的地址将是1004
如果是这样,为什么减去这些地址会得到1
而不是4
?
【问题讨论】:
因为指针算法就是这样定义的。它很有用,因此指针算术可以等效于数组索引。您应该尝试使用搜索引擎查找此主题。 另外,int
类型不,在 C 中,占用 任何特定的内存量。这取决于平台。
假设一个整数在内存中占用 4 个字节是错误的。在许多平台上都是如此,但不是全部。
请注意*(p+1)
与p[1]
相同。他们有什么共同点?两者都知道数据类型的大小。
【参考方案1】:
好吧,您显然误解了指针运算的工作原理。
考虑一下:
int a[5] = 1,2,3,4,5;
int *p = a;
p = p + 1;
现在您希望p
指向哪里?在2
,即at a[1]
?还是您希望它指向1
的中间,即a[0]
的中间?
答案是p
指向a[1]
。
现在考虑
int a[5] = 1,2,3,4,5;
int *p = a;
int *q = a;
p = p + 1;
int b = p-q;
并做一些简单的替换:
int b = p-q;
因为
p is a + 1
q = a
我们得到
int b = (a + 1) - a;
这是
int b = 1;
显然结果是 1。
【讨论】:
【参考方案2】:来自 C11 Standard#6.5.6p9 [强调添加]
两个指针相减时,都指向同一个数组对象的元素,或者是数组对象最后一个元素的后一个; 结果是两个数组元素的下标之差。结果的大小是实现定义的,它的类型(有符号整数类型)是在
头文件中定义的 ptrdiff_t 。 ....
来自this:
指定数组的单个元素的下标只是方括号中的整数表达式。
int a[5] = 1,2,3,4,5;
int *p = a;
int *q = p++;
指针p
和q
都指向同一数组对象的元素,即数组a
。指针p
指向数组a
的第二个元素,即a[1]
(下标为1
),指针q
指向数组a
的第一个元素,即a[0]
(下标是0
)。
p - q
的结果是1 - 0
,等于1
。因此,您将获得输出 1
。
理想情况下,b
的类型应为ptrdiff_t
,并为printf()
提供%td
格式说明符以表示b
:
ptrdiff_t b = p - q;
printf("%td", b);
【讨论】:
以上是关于减去以下两个包含整数的地址返回 1 而不是预期的 4 [重复]的主要内容,如果未能解决你的问题,请参考以下文章