微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

参考评论这一行:

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

该示例打印“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],则将指针移动到“next”数组并尝试取消引用它:

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐