gpt4 book ai didi

c++ - 取消引用指向数组的指针?

转载 作者:可可西里 更新时间:2023-11-01 18:41:55 25 4
gpt4 key购买 nike

引用注释行:

  • 为什么在示例中添加括号可以打印数组的所有内容?

该示例打印“one”,然后打印垃圾。

#include <iostream>

int main() {
const char* a[3] = { "one", "two", "three" };
const char*(*p)[3] = &a;
for(int i = 0; i < 3; i++) {
std::cout << *p[i] << std::endl; // this line
}
return 0;
}

改成这样就可以了:

std::cout << (*p)[i] << std::endl;

最佳答案

p 是指向 3 个元素的数组的指针,如下所示:

┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ p

请注意,它指向整个数组,而不是它的单个元素。

由于运算符的优先级,表达式 *p[i] 被视为 *(p[i])(相当于 *(*( p + i))).这意味着您正在索引指向数组的指针。例如,如果您执行 p[1],您将指针移动到“下一个”数组并尝试取消引用它:

┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ p + 1

如我们所见,那里什么也没有,您将得到未定义的行为。但是,当您执行 (*p)[i](等同于 *((*p) + i))时,您要确保取消引用首先发生。取消引用为我们提供了数组本身,然后可以通过数组到指针的转换将其隐式转换为指向数组第一个元素的指针。所以你得到的是:

┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ *p

在这种情况下,指针指向数组元素 而不是整个数组。例如,如果随后索引 (*p)[1],您将获得:

┌─────┬─────┬─────┐
│ │ │ │
└─────┴─────┴─────┘
^
└─ (*p) + 1

这为您提供了一个有效的 const char*,然后可以通过 cout 输出。

关于c++ - 取消引用指向数组的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16013450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com