我写了几行代码,主要来自一本书,可以让你声明一个integer
数组,然后从数组中减去并传递两个addresses
到另一个integer
,为了传递printf
声明。我不确定原因,但我的实际指针:aPointer
和bPointer
似乎是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}}
答案 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是减法获得的值,而不是地址。