取消引用指针数组中的一个元素
Dereferencing an element of an array of 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)
起作用?
在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/
int t=0;
for(int i = 0; i < 2 ;i++)
p[i] = &t;
cout << *p[i] << "is nothing but value of t" << endl;
我希望它是清楚的。
- lower_bound()返回最后一个元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 访问 for_each 函数中的前一个元素
- 在 QListView 中显示最后一个元素
- 从 std::vector 中选择一个元素,而不是给定元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何从一个无序集合中获取一个元素