c++ - 关于 C++ 中的指针和数组

标签 c++ c arrays pointers

我想问一个关于C++中指针和数组的问题。

int a[10];

int *p1; p1 = &a[0];

int *p2; p2 = a;

int (*p3)[10]; p3 = &a;

p1、p2、p3 有什么区别? 它们非常困惑。

最佳答案

首先,a 是一个包含 10 个 int 的数组。这是简单的部分。

p1 是“指向int 的指针”。您正在为其分配 &a[0] 的值。这采用 a 的第一个元素的地址。所以 p1 现在指向 a 的第一个元素。

p2 也是“指向int 的指针”。您正在将 a 直接分配给它。在这种情况下,必须进行称为数组到指针转换的标准转换。基本上,数组可以转换为指向其第一个元素的指针。您正在将此转换的结果分配给 p2。所以 p2 也是指向 a 的第一个元素的指针。

p3 是“指向 10 个 int 数组的指针”。您正在获取数组 a 的地址并将其分配给此指针。所以现在这个指针指向数组本身(不是它的第一个元素)。

您可能会想“嗯,第一个元素与数组的地址相同,那有什么区别呢?”事实上,当您尝试递增指针时,您会注意到差异。递增 p1p2 将为您提供指向数组第二个元素的指针。递增 p3 将为您提供指向下一个 10 个 int 数组的指针(实际上并不存在)。

┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ int │ int │ int │ int │ int │ int │ int │ int │ int │ int │ 
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
   ^
   └── p1, p2, p3

因此,如果您按照您的描述从所有指向开始,然后递增它们,您将得到:

┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬┄
│ int │ int │ int │ int │ int │ int │ int │ int │ int │ int │ 
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴┄
         ^                                                     ^
         └── p1, p2                                            └── p3

关于c++ - 关于 C++ 中的指针和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15839614/

相关文章:

c++ - 也让 doxygen 记录 #ifdef 部分

c++ - 创建注册表项 - 访问被拒绝

c++ - 按值传递结构是否被压入堆栈?

c - 子进程 pid() 是否被分配给父进程?

python - 如何使用数组值列表检查数组?

arrays - Ejs forEach循环未定义

c++ - 更改数组的2行数据

加载 C++ dll 时 C# 崩溃

c - Linux 时间函数的来源或时钟是什么(time 、 gettimeofday ...)

javascript - 映射和过滤数组,但每 N 个元素添加修改