在C++中使用指针访问多维数组元素

3

我想尝试在C++中使用指针访问多维数组的元素:

#include<iostream>

int main() {

  int ia[3][4] = {
    {0, 1, 2, 3},
    {4, 5, 6, 7},
    {8, 9, 10, 11}
  };

  int (*pia)[4] = &ia[1];
  std::cout << *pia[0] 
    << *pia[1]
    << *pia[2]
    << *pia[3]
    << std::endl;

  return 0;
}

我希望 *pia 是 ia 数组的第二个数组,因此输出结果应该是 4567。
但是,实际输出的结果是 4814197056。我显然做错了。请问如何正确访问行中的元素?

尝试一下这个 int * pia = ia[1]; - i486
1
使用´-std=c++11 -Wall -Wextra -pedantic´选项编译时没有警告。@i486: ´error: invalid type argument of unary ‘*’ (have ‘int’) std::cout << *pia[0]´ - Christoph90
... std::cout << pia[0]; - i486
3个回答

5

目前情况下,您需要编写以下内容

std::cout << (*pia)[0] ...

由于[]的优先级高于*,所以这种情况会出现。然而,我认为您真正想做的是:
int *pia = ia[1];
std::cout << pia[0] 
          << pia[1]
          << pia[2]
          << pia[3]
          << std::endl;

补充说明:你得到的输出结果是这样的,原因是*pia[i]pia[i][0]的另一种写法。由于pia[0]ia[1]pia[1]ia[2],而pia[2]及其之后的值都是垃圾值(因为ia数组长度不足),因此你会先打印ia[1][0],然后是ia[2][0],接着是两个垃圾值。

1
参考资料: C++ 运算符优先级 - moooeeeep
谢谢!我不知道索引运算符可以以那种方式用于指针。所以在原始代码中(使用(*pia)[i]),我混合使用了指向int[]的指针和数组索引,而您的建议仅依赖于指针(和行主序)。在这里使用“纯”指针算术是否有任何优势,还是只是风格问题? - Christoph90
1
看起来更清晰并更常见。而且无论如何,它实际上与数组索引完全相同。这是因为数组会随时解除成指针;每当你写 arr[i] 时,数组就会解除成指针,并执行指针算术运算。 - Wintermute

1
我使用了以下方式进行打印,它运行良好。
std::cout << (*pia)[0]
         << (*pia)[1]
         << (*pia)[2]
         << (*pia)[3] 
         << std::endl;

在 C++ 的优先级表中,[] 的优先级高于 *。

0
  int *pia[] = { &ia[1][0], &ia[1][1], &ia[1][2], &ia[1][3] };

或者

    int* pia = static_cast<int*>(&ia[1][0]);
  std::cout << pia[0] << " "
    << pia[1] << " "
    << pia[2] << " "
    << pia[3] << " "
    << std::endl;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接