c - 整数指针减法

标签 c pointers pointer-arithmetic

我主要根据一本书编写了几行代码,让您声明一个 integer 数组,然后减去数组中的两个 address 并将其传递给另一个数组integer,以便传递到 printf 语句中。我不确定为什么,但我的实际指针:aPointerbPointer 似乎是 8 字节,这在我尝试时会出现问题将减去的 addresses 传递给 integer

然后我将后者更改为 long。现在 Xcode 中不存在错误,但我无法使用确实需要 int%p 说明符正确打印 pointerSubtraction 的地址而不是 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);

最佳答案

您可能喜欢使用类型为 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);

Also^2 :从指针 p 添加或减去值 v 的结果只有当结果 pv 时才是有效地址该操作仍然引用原始指针 p 指向的对象(的元素/成员)。

关于c - 整数指针减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924972/

相关文章:

c - Kill() 正在销毁我的父进程

c - 需要澄清指针递增

c++ - 帮助我理解这个 URL 解码器 :

c - 对于数组,为什么 a[5] == 5[a]?

c - 用于理解指针算术的 OpenCV 视觉效果

c - SDL_QUIT 事件适用于 g++ 但不适用于 gcc

c - windows下C监控文件和目录

c - 如何在没有特殊库的情况下读取 C 中的原始图像?

c - 指针的二维数组

c - 使用 void 指针和类型参数的 C 中多种类型的排序函数