最近在课堂上,我们被介绍了指针和堆,以及它们是如何工作的。我有一个问题是为什么我们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)
起作用?
答案 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)
cout << p[i];
应该按预期工作
因为*p[i]
基本上是*(*(p + i))
在这里阅读https://www.tutorialspoint.com/cplusplus/cpp_pointer_arithmatic.htm http://www.learncpp.com/cpp-tutorial/6-8a-pointer-arithmetic-and-array-indexing/
答案 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;
我希望很清楚。