C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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输出.

大佬总结

以上是大佬教程为你收集整理的c – 取消引用指向数组的指针?全部内容,希望文章能够帮你解决c – 取消引用指向数组的指针?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。