我得到了这段代码:
#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
没有打印任何内容并且出错;它应该是那样的。
答案 0 :(得分:1)
char *p[2][3] = {{"zyx","wvu","ts"},{"rqponm","lkjihgfe","dcba"}}
将打印z
,f
,d
,垃圾,r
,b
在底层我们有'z','y','x','w',......字符。
现在从定义char *p[][]
开始,我们制作了一个2D字符指针数组。即2D阵列仅包含地址。
如何实现2D数组:这是包含其他1D数组地址的1D数组。所以这里我们有p[2][3]
,即一个数组,将创建两个元素,这两个元素中的每一个都将包含另一个具有3个元素的1D数组的地址(基址)。
由于我们将这个2D数组创建为字符指针数组,因此这3个元素将包含其他1D数组(未定义大小)的地址,这些数组保存了我们的字符值。
以下是创建的所有数组的图像以及存储在这些数组中的值:
<强> 1)。 ***p
或*(*(*p))
:
这里p包含两个元素的1D数组(P)的基址。 * p将提取存储在该基地址的值,即'G'的地址。
“*(*p)
”将存储在“G的地址”指向的位置,该地址是数组G的基地址,即“A的地址”
*(*(*p))
将是存储在指向的位置的值
'地址'A'是字符'z'。***p
将返回“z
”。 <强> 2)。 (*(*(p+1)+1))[6]
:
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])
:
*(p+1)+1
”包含“地址”
H'的第二个元素。现在这里'*(p+1)+1)[6]
'表示旁边的第7个值
它会指向一些垃圾地址。并且'((p + 1)+1)[6])'
将存储在该垃圾地址中的值可以是任何值
垃圾价值。 <强> 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
'。