取消引用指向数组的指针?

the*_*nut 7 c++ arrays pointers

参考评论这一行:

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

该示例打印"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;
}
Run Code Online (Sandbox Code Playgroud)

更改为此后它可以工作:

std::cout << (*p)[i] << std::endl;
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 21

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

???????????????????
?     ?     ?     ?
???????????????????
   ^
   ?? p
Run Code Online (Sandbox Code Playgroud)

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

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

???????????????????
?     ?     ?     ?
???????????????????
                     ^
                     ?? p + 1
Run Code Online (Sandbox Code Playgroud)

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

???????????????????
?     ?     ?     ?
???????????????????
   ^
   ?? *p
Run Code Online (Sandbox Code Playgroud)

在这种情况下,指针指向数组元素而不是整个数组.例如,如果你编入索引(*p)[1],你会得到:

???????????????????
?     ?     ?     ?
???????????????????
         ^
         ?? (*p) + 1
Run Code Online (Sandbox Code Playgroud)

这给你一个有效的const char*,然后可以输出cout.


For*_*veR 6

运算符优先级.没有()运算符[]将首先被调用,结果将是dereferenced.有()- 首先会dereference然后打电话给运营商[].