【问题标题】:C++ Multidimension array and Pointer name bracketingC ++多维数组和指针名称括号
【发布时间】:2011-12-03 23:06:43
【问题描述】:

已经提出了很多关于 C++ 多维数组的问题,尽管没有一个 A) 完全解释了我在这里要问的问题,或者 B) 也许我只是不明白。

我的问题:

int (*ip)[4];

我遇到的问题是理解在这种情况下在 *ip 周围添加括号的原因。查看多维数组:

int ia[3][4];
int *ip = &ia[2];
int *ip2[4] = &ia[2];
int (*ip3)[4] = &ia[2];

ip、ip2 和 ip3 都旨在指向位置 ia[2] 处的数组的第一个元素。

  1. ia[2] 只是指向该数组第一个元素的指针,所以 &ia[2] 是该指针的地址吗?正确吗?
  2. 在我看来,可以使用 ip,因为它的工作方式与 char * 的工作方式相同...是吗?没有?
  3. ip2 不正确对我来说是有道理的。对我来说,ip2 是一个指向整数的指针数组,而我在这里想要的是一个指向整数数组的指针。
  4. 我知道 ip3 是正确的。为什么?因为书上是这么说的。就是这样。我不明白括号的重要性。

那么括号是如何改变事物的呢?我真的在这里进行了概念性解释,因此我可以理解并在将来重用这个概念。

再次感谢大家抽出宝贵时间,我还是新手,所以如果有什么我可以做的来改善我的问题,请告诉我。

【问题讨论】:

  • cdecl 将来可能会对您有所帮助
  • 第 4 个是正确的,因为在 c++ 中 operator[] 比 operator* 具有更高的优先级,所以你得到一个包含 4 个指向 int 的指针的数组
  • @SethCarnegie cdecl 很棒!谢谢!

标签: c++ pointers multidimensional-array


【解决方案1】:
  1. 第一个:

    int *ip = &ia[2];
    

    无效。 &ia[2]int[4] 的地址,因此它的类型是int (*)[4],因此不能用于初始化int *。但是,您可以这样写:

    int *ip = ia[2];
    

    现在可以满足您的期望。

  2. 不,见上文。

  3. 确实如此。

  4. 这是正确的,因为这是正确的语法。从中间开始,向外工作。 (*ip3) 表示 ip3 是指向某物的指针。向外工作,它指向的东西是int[4]

【讨论】:

  • 真的吗?我希望 &ia[2]int (*)[4] 类型,就像 OP 一样。不过,我比你更常犯错。
  • @Mooing:是的,这是我的错字!
  • 这很有意义。非常感谢。 “从中间开始,向外工作”这句话在我的脑海中凝固了。
【解决方案2】:

括号是用来表示谁是指针。

int *ip1[4];
int (*ip2)[4];

ip1 是一个由 4 个指向 int 的指针组成的数组。
ip2 是一个指向 4 个 ints 的数组的指针。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多