取消引用指针数组中的一个元素

Dereferencing an element of an array of pointers

本文关键字:一个 元素 引用 指针 数组 取消      更新时间:2023-10-16

最近在课堂上,我们介绍了指针和堆以及它们的工作方式。我的一个问题是,为什么我们不能在该数组中cout一个未引用的指针?例如,在下面的代码中:

#include <iostream>
using namespace std;
int main() {
double* p = new double[2];
*(p + 0) = 37.5;
*(p + 1) = 101.4;
for (int i = 0; i < 2; i++)
cout << *p[i] << endl;
return 0;
}

为什么cout << *p[i]不起作用,而cout << *(p + i)起作用?

在C中,数组的名称是指向第一个元素的指针。C++从C继承了这一点。在程序中,p是指向数组第一个元素的指针。所以你要么像设置元素时那样做指针算术(例如*(p+1)=101.4;)或者使用下标运算符([])进行算术运算:*(p+i)与p[i]相同。编译器将p[i]转换为1)将i添加到p,然后2)访问由和产生的地址。这正是你所写的:*(p+1)。首先计算括号中的语句,并将引用运算符应用于该结果。如果使用索引运算符,则会发生这种情况。所以你的循环必须看起来像这样:

for (int i = 0; i < 2; i++)
{
std::cout << p[i] << std::endl;
}

由于运算符的优先级,您的语句*p[i]转换为*(p[i])。因此,此语句尝试使用从数组中读取的双值作为应访问的地址。这是不可能的,这是显而易见的(希望如此)。

明白了吗?

附言:请帮自己一个忙,总是用花括号把for/while/if语句的正文括起来。这为你节省了很多时间(尤其是调试你自己的废话)。相信我,这是真的。

p[1] = *(p + 1)这正是您想要做的。[]运算符已取消引用。*p[1] = *(*(p + 1))它试图取消引用双Wich不可能发生

cout << p[i]; 

应该如你所期望的那样工作因为*p[i]基本上是*(*(p + i))

帮我读这里https://www.tutorialspoint.com/cplusplus/cpp_pointer_arithmatic.htmhttp://www.learncpp.com/cpp-tutorial/6-8a-pointer-arithmetic-and-array-indexing/

请注意,p[i]与*(p+i)相同。现在*p[i]是没有意义的,除非p[i]本身指向不同的位置,例如
int t=0;
for(int i = 0; i < 2 ;i++)
p[i] = &t;
cout << *p[i] << "is nothing but value of t" << endl;

我希望它是清楚的。