【问题标题】:Output Explanation: A complicated pointer arithmetic输出说明:一个复杂的指针算法
【发布时间】:2011-05-05 11:28:21
【问题描述】:

我一直在尝试理解这个程序的输出:

#include <stdio.h>    
int main(){
    static int arr[] = {0, 1, 2, 3, 4};
    int *p[] = {arr, arr+1, arr+2, arr+3, arr+4};
    int **ptr = p;

    ptr++;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    *ptr++;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    *++ptr;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    ++*ptr;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);    

    return 0;
}

OUTPUT

1 1 1
2 2 2
3 3 3
3 4 4

谁能解释一下输出?

【问题讨论】:

标签: c pointers


【解决方案1】:

在第一个 ptr++ 之后,它将是: 因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr); 将给出:1 1 1

在 *ptr++ 之后它将是: 因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr); 将给出:2 2 2

*++ptr 之后是:

因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr); 将给出:3 3 3

在++*ptr之后,会是:

因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr); 将给出:3 4 4

希望对你有帮助。

【讨论】:

  • Ptr 指向 p[1],p 是 p[0]。因此差异1.是指针差异。,希望有所帮助。
【解决方案2】:

您可能想阅读 the C99 Standard 中的 6.5.6。

基本上,指针之间的区别

  1. 它们必须指向同一个数组中(或最后一个)
  2. 区别在于分隔指针的元素数(或分割的字节数是每个元素的大小,以字节为单位)。

【讨论】:

    【解决方案3】:

    我将尝试只解释第一个printf。我认为理解其余的printfs应该足够了。正如其他人所注意到的,代码是基于在 C 语言中玩指针算术。

    arr 数组包含从 0 到 4 的五个数字。 p 是一个指向整数的指针数组,其中填充了存储在arr 中的数字的“地址”。 ptr 是一个指向整型指针的指针,它用p 初始化(因为在 C 语言中,指针数组等同于指向指针的指针)。

    然后,ptr 递增。请记住,我们正在增加地址,所以现在它指向p 数组中的(arr+1) 元素。 这就是ptr-p 返回 1 的原因。换句话说,我们正在减去地址。

    *ptr 指向arr + 1 元素。这就是为什么第二个值也等于 1。

    通过**ptr,我们检索存储在arr+1 地址的值,它也是1。

    【讨论】:

      【解决方案4】:

      主要要考虑的是指针上的算术运算。

      执行以下操作,即add + 1 = add + 1*(size of the data type of the data which is pointed by that address)

      ++-- 也一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 2023-01-09
        • 1970-01-01
        • 2014-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多