C语言:这道二维数组输入字符串的执行顺序是怎样的?帮我看看~跪谢~跪谢~

来源:百度知道 编辑:UC知道 时间:2024/06/01 05:06:29
#include<stdio.h>
main()
{
int i=0;
char a[3][4]={"\0"},(*p)[4];

printf("Input 3 string:\n");
for(p=a;p<a+3;p++)gets(p[0]);
printf("Ouput 3 string:\n");
for(i=0;i<3;i++)puts(a[i]);
}

for(p=a;p<a+3;p++)gets(p[0]);
这儿我就有些迷糊啦
循环的顺序是怎样的呢?哪个是控制输入的时候从p[0][0]p[0][1]p[0][2]
哪个是控制从p[0][0]p[1][0]p[2][0]的呢?晕了晕了

这个P指针是指向字符数组的指针, char (*p)[4]可以认为char* p[];只不过是每个字符串的长度限定为3(\0占用了一个字符),看看这样是不是好理解了。他每自加一次, 就会指向下一个字符串。

a[3][4]用于存放三个字符串,每个字符串总长度不超过4字节 ,即每行存放一个字符串
for(p=a;p<a+3;p++)gets(p[0]); 输入三个字符串, 按顺序存入数组中

char a[3][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
a 这个数组含有 3 个元素,每个元素又是个包含 4 个 char 的数组,即 char[4]。不管 a 是个几维数组,在 C++ 里面它其实就是个一维数组。char[4] 这种写法你一定不陌生,因为想动态分配一个字符数组就必须 char* p = new char[4];

char (*p)[4];
p 是一个指向"char[4] 类型"的指针。

因为 a 的每一个元素(a[0][0]/a[0]、a[1][0]/a[1]、a[2][0]/a[2])都是一个 char[4],所以 p 可以指向它们。

第一个 for 循环做 3 次。p = a,就是让 p 指向 a[0];a + 3 是指针加法,a + 3 以后指向 a[3],这个元素是不存在的,所以有 p < a + 3:
1. p 指向 a[0],往 a[0][0], a[0][1], a[0][2], a[0][3] 里面各放入一个 char,共 4 个,或许更多;p++,这是指针加法,现在 p 指向 a[1]。
2. 基本同上,从 a[1][0] 开始逐个填入字符,然后 p 指向 a[2]。
3. 基本同上,然后 p 指向 a[3]。
4. p == a + 3,退出循环。

第二个 for 循环用 i 控制,循环做 3 次,puts(a[i]) 把 a[i] 当作字符串首地址指针,结果就是,依次输出以a[0][0],a[1][0],a[2][0] 开始的字符串,即二维数组 a 的三个子串