【问题标题】:Pointer of array, what is the difference between (*ptr)[] and *ptr[]数组指针,(*ptr)[]和*ptr[]有什么区别
【发布时间】:2021-05-11 09:26:12
【问题描述】:

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

#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。

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

这两者有什么区别?

【问题讨论】:

  • 第二个是未定义的行为。第一个相当于pas[0][2] 第二个相当于pass[2][0]
  • 只需使用-Wall 启用警告。您将收到“警告:数组下标 6 在 'short int [3]' [-Warray-bounds] 11 | cout

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


【解决方案1】:

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

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 }
};

并初始化指针paslike

short (*pas)[3] = tell;

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

pass[2][2]

包含值9

上面的表达式也可以不用下标操作符来改写

*( *( pass + 2 ) + 2 )

【讨论】:

    【解决方案2】:

    一个简单的例子可以是:

    int *ptr[10];
    

    这是一个由 10 个 int* 指针组成的数组,不像您想象的那样,是一个指向 10 个整数数组的指针

    int (*ptr)[10];
    

    这是一个指向 10 int 数组的指针

    我相信和int *ptr;一样,两者都可以指向一个数组,但给定的形式只能指向一个10个整数的数组

    您也可以查看this 示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2022-01-15
      • 2021-02-28
      • 2021-04-06
      相关资源
      最近更新 更多