gpt4 book ai didi

c - 减去两个地址给出错误的输出

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:35 25 4
gpt4 key购买 nike

int main()
{
int x = 4;
int *p = &x;
int *k = p++;
int r = p - k;
printf("%d %d %d", p,k,p-k);
getch();
}

输出:

2752116 2752112 1

为什么不是 4

而且我不能使用 p+k 或除 -(减法)之外的任何其他运算符。

最佳答案

首先,您必须为提供的格式说明符使用正确的参数类型,提供不匹配的参数类型会导致 undefined behavior .

  • 您必须使用 %p格式说明符并将参数转换为 void *打印地址(指针)

  • 要打印指针减法的结果,您应该使用 %td , 结果的类型是 ptrdiff_t .


也就是说,关于结果 1对于减法,指针运算遵循数据类型。引用 C11 , 第 6.5.6 章,(强调我的)

When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; the result is the difference of the subscripts of the two array elements. The size of the result is implementation-defined, and its type (a signed integer type) is ptrdiff_t defined in the <stddef.h> header. [....] if the expressions P and Q point to, respectively, the i-th and j-th elements of an array object, the expression (P)-(Q) has the value i−j provided the value fits in an object of type ptrdiff_t. [....]

因此,在您的情况下,p 的索引和 k相隔一个元素,即 |i-J| == 1 ,因此结果。


最后,您不能(或乘或除)两个指针,因为那毫无意义。指针是内存位置,从逻辑上讲,您无法理解添加两个内存位置。只有减法才能找到两个数组成员/元素之间的相关距离。

相关约束,来自 C11 , 第 6.5.6 章,加法运算符,

For addition, either both operands shall have arithmetic type, or one operand shall be a pointer to a complete object type and the other shall have integer type. (Incrementing is equivalent to adding 1.)

关于c - 减去两个地址给出错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44498435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com