取消引用指针数组的元素

时间:2017-10-23 16:57:28

标签: c++ arrays pointers

最近在课堂上,我们被介绍了指针和堆,以及它们是如何工作的。我有一个问题是为什么我们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)起作用?

4 个答案:

答案 0 :(得分:1)

在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])。因此,此语句尝试使用数组中的双重读取作为应访问的地址。这是不可能的,很明显(希望如此)。

知道了吗?

P.S。:并且请你自己帮个忙,并且总是用大括号包围for / while / if语句的主体。这可以节省很多时间(特别是调试你自己的废话)。相信我,这是真的。

答案 1 :(得分:0)

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

注意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;

我希望很清楚。