我正在玩指针以完全获得概念,然后想要减去两个指针,期望这两个地址之间的距离或东西,但显然我错了,所以这是我的代码。
index.html
为什么程序输出int x = 5, y = 7;
int *p = &y;
int *q = &x;
printf("p is %d\nq is %d\np - q is %d", p, q, (p - q));
?谢谢。
答案 0 :(得分:11)
这是未定义的行为。根据标准(N1570
):
6.5.6附加运营商
....
9 当减去两个指针时, 都应指向同一个数组对象的元素, 或者超过数组对象的最后一个元素 ;结果是 的差异 下载 两个数组元素。
请注意,如果允许,则结果为下标差异。因此,如果指针指向同一类型的两个连续元素,则无论类型的大小如何,减法都会给出1
。 (这也许就是你在具体案例中得到1
的原因。)
答案 1 :(得分:3)
由于p
和q
指向不相关的对象,因此您的特定情况会导致未定义的行为。
只有当p-q
和p
指向同一个数组/同一个数组的最后一个元素之后,才能理解q
。
int array[10];
int* p = &array[0];
int* q = &array[5];
int ptrdiff_t = q - p; // Valid. diff1 is 5
int ptrdiff_t = p - q; // Valid. diff2 is -5
在这种情况下, q - p
为5,因为它们指向的数组元素相隔5个元素。
换句话说,p+5
等于q
。如果从p
开始并跨越数组的5个元素,您将指向q
指向的数组的相同元素。
另外,不要使用格式说明符%d
来打印指针。使用%p
。将%td
用于ptrdiff_t
。
printf(" p is %p\n q is %p\n p-q is :%td", p, q, p-q);`
// ^^ ^^
有关不同类型的有效格式说明符,请参阅http://en.cppreference.com/w/c/io/fprintf。
答案 2 :(得分:1)
指针算法就是这样的。它没有给你两个地址之间的差异。相反,它将显示两个变量之间的差异,就好像它们存储在数组中一样。所以,无论你的变量(相同类型)是4个字节,8个字节还是1个字节,如果存储在相邻的存储器位置,它们的指针减法总是会产生1或-1。
答案 3 :(得分:1)
两个指针相减得出两个变量之间的距离。 例如。
///让a的地址为1000,然后a + 1的地址为1004
int a[]={1,2,3};
int *p1=a;
int *p2=a+1;
printf("%u",p2-p1);
此结果将是1而不是4。 同样在您的情况下,x和y的位置是连续的,这就是为什么ans。是1。
答案 4 :(得分:-1)
将数组中的两个指针相减将得出两个元素之间的距离。
让第一个元素的地址为1000,然后第二个元素a+1
的地址为1004。因此,p1 = 1000
和p2 =1004
。
p2-p1 = (1004- 1000) /size of int = (1004-1000)/4 =4/4 =1