【问题标题】:C: Call a variable from a multidimensional array using pointer [duplicate]C:使用指针从多维数组中调用变量[重复]
【发布时间】:2014-03-29 14:30:35
【问题描述】:

在一些人证明a[5] == 5[a] is true
C 标准将[] 运算符定义为a[b] == *(a + b)

我一直在想一个多维数组,例如:

int x[2][2]={
        {'A','B'},
        {'C','D'}};

我可以使用x[0][0]x[0][1]x[1][0]x[1][1] 来回显变量
但是如何使用指针呢?

【问题讨论】:

  • 拜托,拜托,不要那样做 :)
  • 答案直接来自你提到的[]的定义。
  • 我试过了,但我想不通,所以我问...
  • 我不知道这个问题在这里可能已经有了答案

标签: c


【解决方案1】:

以下是答案:

x[0][0] ➜ *(x[0]+0) ➜ *(*(x+0)+0)
x[0][1] ➜ *(x[0]+1) ➜ *(*(x+0)+1)
x[1][0] ➜ *(x[1]+0) ➜ *(*(x+1)+0)
x[1][1] ➜ *(x[1]+1) ➜ *(*(x+1)+1)

解释: 从地址中获取/回显值使用解引用指针*,并且应该遵循值的来源地址。

我们以x[1][0]为例:

  • 我们正在获取 x[1] 的地址 + 偏移值,或者 我们将从当前地址移动多远,我们的偏移量是 0,因此使用 x[1][0] 的地址指针是x[1]+0
    并且要获取该值将添加* 运算符来调用地址内的值,现在我们有*(x[1]+0)

但我们仍然使用方括号[] 运算符获取第一个地址x[1],所以使用指针...

  • 我们将使用指针通过从偏移量移动到偏移量来获取x[1][0],我们现在唯一需要做的就是在*(x[1]+0) 中转换x[1],所以它会是*(*(x+1)+0)

See it working, Click Here
同样的过程发生在多维数组上

还有……只要有可能,你就可以把方程式简单化

可以简化:*(*(x+0)+0)*x,
*(*(x+1)+0)*(x+1)
*(*(x+0)+1), ➜ *(*x+1)
无法简化:*(*(x+1)+1)

原因为什么?如前所述,我们正在从一个偏移量移动到另一个偏移量,我们不会将偏移量加在一起

  • *(*(x+0)+0) 显然,没有移动偏移量,所以它可以像 *x 这样简单
  • *(*(x+1)+0) 内部地址上的这个偏移量已经移动了*(x+1),但外部地址没有+0 所以它可能是*(x+1) 本身
  • *(*(x+0)+1) 内部地址上的这个偏移量没有移动x+0,但外部地址已经移动了+1,因此它可以将*(x+0) 称为*x,从而使其成为*(*x+1)
  • *(*(x+1)+1) 这个不能再简化了,因为我们需要在内部指针调用中移动 1 个偏移量,然后再移动 1 个偏移量。

【讨论】:

  • 您的答案适用于x[0][0]x[0][1],但它给出了x[1][0]x[1][1] 的错误。在*(*(x+1)+0)应该回显C但它回显B,同样对于应该回显D*(*(x+1)+1),它回显C
  • 先生,那我该如何在x[1][0]x[1][0] 上做呢?你能更新你的答案吗?
  • printf("%c %c\n",*(*(x+1)+0),x[1][0]); 都打印“C”。你用的是什么编译器?
  • 它在 Borland TurboC++ 中也能正常工作。你可能做错了什么。您可以在此处发布源代码的最小化版本吗?
【解决方案2】:

因为它是一个二维数组,你应该使用 * 两次

*(*(x+0)+1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2014-11-20
    • 2018-01-04
    相关资源
    最近更新 更多