整数指针减法

时间:2014-01-04 18:30:33

标签: c pointers pointer-arithmetic

我写了几行代码,主要来自一本书,可以让你声明一个integer数组,然后从数组中减去并传递两个addresses到另一个integer,为了传递printf声明。我不确定原因,但我的实际指针:aPointerbPointer似乎是8 bytes,当我尝试将减去的addresses传递给integer

然后我将后者更改为long。现在Xcode中不存在这些错误,但是我无法使用pointerSubtraction说明符正确打印%p的地址,而int说明符确实需要long而不是 int arrayOfInts[10]; for (int i = 0; i < 10; i++) { arrayOfInts[i] = i; printf("%d", arrayOfInts[i]); // prints out 0123456789 } printf("\n"); int *aPointer = &arrayOfInts[1]; // get address of index 1 int *bPointer = &arrayOfInts[7]; // get address of index 7 long pointerSubtraction = bPointer - aPointer; // subtract index 7 with 1 printf("The size of aPointer is %zu bytes \n", sizeof(aPointer)); printf("The size of aPointer is %zu bytes \n", sizeof(bPointer)); printf("The address of aPointer is %p \n", aPointer); printf("The address of bPointer is %p \n", bPointer); printf("The address of final is %p \n", pointerSubtraction); printf("The value of pointerSubtraction is %ld \n \n", pointerSubtraction); 。< / p>

{{1}}

2 个答案:

答案 0 :(得分:2)

您可能希望使用变量类型ptrdiff_t来存储两个指针值的差异,即两个地址。

printf() ptrdiff_t "t"使用长度修饰符ptrdiff_t。由于"d"是有符号整数,请使用转换说明符#include <stddef.h> #include <stdio.h> int main(void) { int a = 0; int b = 0, * pa = &a; ptrdiff_t ptr_diff = pa - &b; printf("pd = %td\n", ptr_diff); return 0; }

"p"

转换说明符void仅针对指向printf()的指针 。所以 printf("The address of aPointer is %p \n", (void *) aPointer); printf("The address of bPointer is %p \n", (void *) bPointer); 调用看起来像:

v

另外^ 2:如果操作的结果p仍然引用(一个元素),则从指针pv添加或减去值p的结果只是一个有效地址/成员)原始指针{{1}}指向的对象。

答案 1 :(得分:1)

在您的代码中,aPointer是* aPointer指向的值。 bPointer也是一样。

正如评论所说,pointerSubtraction是减法获得的,而不是地址。