【问题标题】:Why does a pointer behave like this in c++ [duplicate]为什么指针在c ++中表现得像这样[重复]
【发布时间】:2014-12-14 06:01:04
【问题描述】:

我在竞赛试卷中发现了这个程序:

#include <iostream>
void main() 
{    
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int*)(&a + 1);
    printf("%d %d ",*(a + 1), *(ptr - 1));
}

输出为2 5

现在当我将第 5 行更改为 int *ptr=(int*)(&amp;a);printf("%d %d ",*(a + 1), *(ptr));

输出变成2 1

在第一种情况下,ptr 获得了array+1 的最后一个地址,而在第二种情况下,ptr 获得了相同的数组地址(a 的地址)。

我的疑问是,为什么当 a 递增并分配给 ptra 分配给 ptr 而不递增时,此分配会显示不同类型的行为?

【问题讨论】:

  • void main() 不是有效的 C++。
  • (&a + 1) 与 (&a[0] + 1 ) 或 (a + 1) 不同。不确定这是否是您在分配给 int *ptr 时的意图。
  • @MohitJain,*(a+1)==a[1]。所以不是UB。
  • @CoolGuy 抱歉 *(((int *)(&amp;a + 1)) - 1) 是 UB。 Read this post 了解详情。
  • @MohitJain 如果我知道你之前提到的问题,我会在这里提出一个新问题,我不知道如何谷歌我的疑问,以便弹出你提到的问题!

标签: c++ c arrays pointers address-operator


【解决方案1】:

当你获取数组的地址时,你会得到一个指向 5 个整数数组的指针(即int(*)[5])。当您增加该指针时,它会移动 5 个整数数组的大小。所以它指向数组序列中的下一个数组(如果你实际上有一个数组序列)。然后,当您将该指针转换为int* 时,它会成为指向第二个(不存在的)数组的第一个int 的指针,它是第一个数组的最后一个元素之后的一个元素。这就是您的第一个示例所发生的情况。

在您的第二个示例中,您不会递增指向数组的指针,因此当您将其转换为 int* 时,它会变成指向数组中第一个 int 的指针。

【讨论】:

    【解决方案2】:

    &amp;a 是一个指向大小为 5 的整数数组的指针,而 ptr 是一个 int*。因此,&amp;a + 1int[5] 的大小递增,而int* 上的指针运算将指针的值更改为sizeof(int) 的倍数。因此,&amp;a + 1a 的地址指向5*sizeof(int) 的地址。将其转换为 int* ptr 并执行 ptr-1 将为您提供 a[4] 的地址。

    【讨论】:

      【解决方案3】:
      &a + 1;
      

      这里,简单的a 指的是数组的基地址,即第一个元素的地址。当您说a+1 时,编译器将看到+1 应用于pointer to an int。所以,它会增加偏移量,这将使它跳转到下一个整数。

      但是,当您说&amp;a 时,它表示该数组元素的地址(类型为int [5])。因此,向其添加一个意味着下一个偏移量将指向该类型的下一个数组,即间接指向数组的过去一端。 在不取消引用之前,获取过去数组元素的地址是没有问题的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 2015-09-24
        • 1970-01-01
        相关资源
        最近更新 更多