啊这啧啧啧 发表于 2023-4-29 23:23:39

想请教友友一个小小的问题

char a = {
      {
                {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
      },
      {
                {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
      },
      {
                {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
      },
      {
                {'s', 't'}, {'u', 'v'}, {'w', 'x'}
      }
};
char (*pa) = &a;
char (*ppa) = &a;
//想要通过指针 pa 和 ppa 访问数组 a 中的 'x' 元素,请问表达式应该怎么写?
//答:*(*(pa+8)+1) 和 *(*(*(ppa+2)+2)+1))。
//这个答案不应该指向'r',

isdkz 发表于 2023-4-29 23:26:35

本帖最后由 isdkz 于 2023-4-29 23:41 编辑

您好!我能理解您的问题。这里有一个三维数组 a ,您希望通过指针 pa 和 ppa 访问数组中的元素'x'。我会帮您解答。

首先,需要纠正您提供的答案,它们都不是正确的访问元素'x'的方法。

您可以使用以下表达式来访问元素'x':

通过指针 pa 访问元素'x':
*(*(pa + 3 * 2) + 1)


通过指针 ppa 访问元素'x':
*(*(*(ppa + 2) + 2) + 1)


让我解释一下这些表达式的计算过程:

1. 对于 pa 指针:
    ·pa 已经指向 a ,因此我们需要从 a 移动到 a 的位置。
    · 由于 a 的第二维长度为3,我们需要移动2个完整的三维数组部分(即3 * 2 = 6个 char 元素)以及最后一个三维数组的前两个元素。
    · 所以,我们需要将 pa 指针移动8个 char 元素,即 pa + 3 * 2 。
    · 接下来,我们需要访问第二个元素(即'x'),因此我们需要在上一步的基础上再加1,即 *(pa + 3 * 2) + 1 。
    · 最后,我们需要解引用指针,得到 *(*(pa + 3 * 2) + 1) 。

2. 对于 ppa 指针:
    ·ppa 已经指向 a ,因此我们需要从 a 移动到 a 的位置。我们只需要将 ppa 指针移动2个位置,即 ppa + 2 。
    · 然后,我们需要访问第三个子数组(即 a ),所以我们需要在上一步的基础上再加2,即 *(ppa + 2) + 2 。
    · 接下来,我们需要访问第二个元素(即'x'),因此我们需要在上一步的基础上再加1,即 *(*(ppa + 2) + 2) + 1 。
    · 最后,我们需要解引用指针,得到 *(*(*(ppa + 2) + 2) + 1) 。

陶远航 发表于 2023-4-30 00:41:08



非常感谢您指出错误。您是正确的,答案不应该指向 'r',而应该指向 'x'。因此,正确的表达式是:

*(*(pa+8)+1) 和 *(*(*(ppa+2)+2)+1)

其中,pa 是指向 a 的指针,因此 *(pa+8) 将指向 a。然后,对于指针 *(pa+8),加 1 将指向 a,因此 *(*(pa+8)+1) 将返回 'x'。

ppa 是指向 a 的指针,因此 *(ppa+2) 将指向 a。然后,对于指针 *(ppa+2),加 2 将指向 a,因此 *(*(*(ppa+2)+2)+1) 将返回 'x'。

再次感谢您的纠正。
页: [1]
查看完整版本: 想请教友友一个小小的问题