C中的复指针语句

时间:2016-12-18 15:22:59

标签: c arrays pointers matrix

我得到了这段代码:

#include <stdio.h>

int main(void)
{
    char *p[2][3] = {{"zyx","wvu","ts"},{"rqponm","lkjihgfe","dcba"}};

    printf("%c \n",***p);
    printf("%c \n",(*(*(p+1)+1))[6]);
    printf("%c \n",**(p[1]+2));
    printf("%c \n",*(*(p+1)+1)[6]);
    printf("%c \n",**p[1]);
    printf("%c \n",*(p[1][2]+2));
    return 0;
}

我运行了该代码,但我无法弄清楚为什么每行打印出的内容。另外,我知道第四个printf没有打印任何内容并且出错;它应该是那样的。

1 个答案:

答案 0 :(得分:1)

char *p[2][3] = {{"zyx","wvu","ts"},{"rqponm","lkjihgfe","dcba"}}

将打印zfd,垃圾,rb

在底层我们有'z','y','x','w',......字符。 现在从定义char *p[][]开始,我们制作了一个2D字符指针数组。即2D阵列仅包含地址。

如何实现2D数组:这是包含其他1D数组地址的1D数组。所以这里我们有p[2][3],即一个数组,将创建两个元素,这两个元素中的每一个都将包含另一个具有3个元素的1D数组的地址(基址)。 由于我们将这个2D数组创建为字符指针数组,因此这3个元素将包含其他1D数组(未定义大小)的地址,这些数组保存了我们的字符值。 以下是创建的所有数组的图像以及存储在这些数组中的值: Image showing all the arrays with names

要打印:

<强> 1)。 ***p*(*(*p))

  • 这里p包含两个元素的1D数组(P)的基址。 * p将提取存储在该基地址的值,即'G'的地址。

  • *(*p)”将存储在“G的地址”指向的位置,该地址是数组G的基地址,即“A的地址”

  • *(*(*p))将是存储在指向的位置的值 '地址'A'是字符'z'。
  • 因此***p将返回“z”。

<强> 2)。 (*(*(p+1)+1))[6]

  • 由于p包含1D阵列的基地址,即地址 1D数组P的第一个元素。
  • p+1将成为p的下一个地址,即第二个地址 1D数组的元素P.
  • *(p+1)将存储在'p+1'的值,即'H'的地址,其中包含H数组的基址(如果第一个元素为 H)。
  • *(p+1)+1将是下一个地址,它将是H的第二个元素的地址。
  • *(*(p+1)+1)将存储在H的第二个元素处,该值是E的地址(E数组的基址。
  • *(*(p+1)+1)[6]将是该数组中的第7个字词“f”。

第3)。 **(p[1]+2)

  • 这里p[1]指向p指向的数组的第二个值 是'H'的基地址(指向H中的第一个元素) 数组)。
  • p[1]+2将成为'H'的基地址的第二个下一个值(或 指向H数组中第一个元素的地址 '地址到H数组中的第三个元素'。
  • *(p[1] + 2)将是'H数组中第三个元素的地址'的值,它将是'H'的第三个元素的值' 是'F'的基地址。
  • **(p[1] + 2)将存储在'F'的基地址'd'。

<强> 4)。 *(*(p+1)+1)[6])

  • 根据上述案例2计算,“*(p+1)+1”包含“地址” H'的第二个元素。现在这里'*(p+1)+1)[6]'表示旁边的第7个值 它会指向一些垃圾地址。并且'(p + 1)+1)[6])' 将存储在该垃圾地址中的值可以是任何值 垃圾价值。
  • 在这里观察不同之处:它不会询问H的第二个元素旁边的第7个值(如果是,答案是 'f')但相反,它询问了旁边的第7个值 H的第二个元素的地址。

<强> 5)。 **p[1]

  • 这里p[1]将是指向的数组的第二个元素的值 'p'是'H'的基地址。
  • *p[1]将是'H'的基地址指向的值,即'D'的基地址。
  • **p[1]将是“D的基地址”指向的值,即“r”。

<强> 6)。 *(p[1][2]+2)

  • 此处p[1][2]将是第2行(H-array)第3个元素的值 这是'F的基地址,进一步是'd'的地址 字符)。

  • 'p[1][2]+2'将成为'd'地址的第二个下一个值 是'b'的地址

  • *( p[1][2]+2)将是'地址'的值'b'。