【问题标题】:Pointer arithmetic getting wrong output [duplicate]指针运算得到错误的输出[重复]
【发布时间】:2014-10-02 08:27:26
【问题描述】:

在下面的程序中,这里的ptr被声明为一个指向整数指针的指针,并分配了数组p[]的基地址,该数组已经被声明为一个整数指针数组。假设ptrptr递增之前包含地址9016(假设p的起始地址为9016),在ptr++之后,它将包含值9020(假设int占用4个字节)。

所以ptr-p 应该将输出设为 4,即 (9020-9016=4)。但它给出的输出为 1 。为什么?

#include<stdio.h>
int main()
{
    static int a[]={0,1,2,3,4};
    static int *p[]={a,a+1,a+2,a+3,a+4};
    int **ptr=p;
    ptr++;
    printf("%d",ptr-p);
    return 0;
}

【问题讨论】:

  • 将指针分别转换为整数类型,然后再减去。

标签: c pointers pointer-arithmetic


【解决方案1】:

一个指针减去另一个指针的结果是它们之间的元素数,而不是字节数。

int **ptr=p;
ptr++;

ptr 向前移动一个元素,所以ptr - p 的值为1

顺便说一句,此行为与ptr++ 一致(在您的示例中表示ptr = p + 1;

【讨论】:

  • 谢谢@yu Haothanki
【解决方案2】:

一个指针与另一个相同基类型的指针相减返回一个整数,表示两个指针之间的元素个数。

如果我们有2个指针,两个int指针p1p2,分别包含地址1000和1016,那么p2-p1将给出4(因为int的大小为4)。

【讨论】:

    【解决方案3】:

    当您找到两个指针之间的差异时,您将获得它们之间的对象数。 在这种情况下,由于对象是整数类型,因此您正确地得到了值 1。

    如果您想知道以字节为单位的值,那么您应该这样做:

    printf("%d",(char *)ptr-(char *)p);
    

    它将打印 4。

    【讨论】:

      猜你喜欢
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多