c++ - 数组指针,(*ptr)[] 和 *ptr[] 有什么区别

标签 c++ c++11 pointers operator-precedence pointer-arithmetic

当我试图理解这个数组的指针时遇到了一件奇怪的事情

#include <iostream>

int main() {
    using namespace std;

    short tell[3]{1, 2, 3};

    short (*pas)[3] = &tell;

    cout << (*pas)[2] << endl;
    cout << *pas[2] << endl;

    cout << endl;

    return 0;
}

我的两个输出有两个不同的值。

第一个是正确的,是3。

但是,对于第二个,它似乎每次都返回一个不同的随机数。

这两者有什么区别?

最佳答案

你声明了一个指向整个数组的指针

short (*pas)[3] = &tell;

所以要获得指向的对象(数组),你必须取消引用指针

*pas

现在这个表达式产生一个对数组 tell 的左值引用。所以你可以应用下标运算符来访问数组的元素

cout << (*pas)[2] << endl;

后缀下标运算符的优先级高于一元运算符*

就是这个表达式

*pas[2]

等同于表达式

*( pas[2] )

这意味着您正在尝试访问超出已分配数组的对象(数组),这会导致未定义的行为。

如果你有一个二维数组,例如

short tell[3][3] =
{ { 1, 2, 3 },
  { 4, 5, 6 },
  { 7, 8, 9 }
};

并像pas一样初始化指针

short (*pas)[3] = tell;

表达式 pass[2] 将生成数组的第三个元素,即 { 7, 8, 9 } 在这种情况下,您可以再应用一个下标运算符访问数组的元素,例如

pass[2][2]

包含值 9

上面的表达式也可以不用下标运算符重写

*( *( pass + 2 ) + 2 )

关于c++ - 数组指针,(*ptr)[] 和 *ptr[] 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66090346/

相关文章:

c++ - 在 C++ 中处理 xml 的好方法

c++ - Visual Studio 中///<comment> </comment> 的用途是什么

C++ While 循环中的 vector 拆分有什么问题

c++ - 我可以依赖无序 map 的顺序吗?

c++ - 迁移 C-->C++ 指向函数的指针会引发编译器错误

c++ - OpenCV RHO 单应性方法不适用于 perspectiveTransform

c++ - 函数模板参数编译错误

c++ - 嵌套类。错误 : expected parameter declarator - for inner class instance

c - 将 char* 拆分为 char * 数组

c - 将常量指针作为参数传递给另一个函数的问题