繁体   English   中英

解引用指针数组的元素

[英]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])。 因此,此语句尝试将对数组的两次读取用作将要访问的地址。 这是不可能的,这是显而易见的(希望如此)。

得到它了?

PS:拜托,请帮个忙,并始终用花括号将for / while / if语句的主体包围起来。 这样可以节省大量时间(尤其是调试自己的废话)。 相信我,这是真的。

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/

p[1] = *(p + 1)是您要执行的操作。 []运算符已经取消引用。 *p[1] = *(*(p + 1))尝试取消引用两次Wich的操作

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

我希望这很清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM