c++ - 为什么指针在 C++ 中表现得像这样

标签 c++ c arrays pointers address-operator

<分区>

我在竞赛试卷中找到了这个程序:

#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*)(&a); 时和 printf("%d %d ",*(a + 1), *(ptr));

输出变为2 1

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

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

最佳答案

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

在你的第二个例子中,你没有递增指向数组的指针,所以当你将它转换为 int* 时,它变成了指向第一个 int 的指针数组。

关于c++ - 为什么指针在 C++ 中表现得像这样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27466785/

相关文章:

c++ - 计算大数的方差

jquery - 从 jQuery 集合中删除第一个元素(shift() 等效)

java - 将 HTML 文件的 byte[] 转换为 String

c++ - 使用GCC编译游戏时出现错误。 (错误: changes meaning of ”Screen” from ”class Screen” [-fpermissive])

c++ - 模板化功能设计以实现可扩展性

c++ - 定义集合 C++

c - C 中的 atoi 返回 -1

javascript - ComboBox.store.loadData 无法加载单项数组

c++ - NVCC + Cereal,没有那个文件或目录

c++ - 何时以及如何对不同类型的文件进行读/写 block (即暂停您的程序)?