鱼C论坛

 找回密码
 立即注册
查看: 1187|回复: 5

[已解决]带你学C带你飞--指针数组与数组指针--课后动动手2题

[复制链接]
发表于 2023-8-8 19:47:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
课后动动手2题的代码是:
#include <stdio.h>
#include <string.h>

int main()
{
        char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};
        char *(*p)[5] = &array;
        int i, j;

        for (i = 0; i < 5; i++)
        {
                for (j = 0; j < 5; j++)
                {
                        if (i > strlen((*p)[j]) - 1)
                        {
                                break;
                        }
                        printf("%c ", (*p)[j][i]);
                }
                printf("\n");
        }

        return 0;
}
请教一下为什么要写
if (i > strlen((*p)[j]) - 1)
                        {
                                break;
                        }

希望各位大神不吝赐教,感谢!
最佳答案
2023-8-9 09:55:39
这段代码是一个嵌套循环,它的目的是将一个字符串数组中的字符按列输出成一个倒三角形状。让我解释一下这段代码中的那个条件语句:if(i>strlen((*p)[j])-1){break;}

首先,让我们逐步分析代码的作用:

1. char* array[5]:定义了一个包含5个指向字符型指针的数组,每个指针指向一个字符串。

2. char* (*p)[5] = &array:定义了一个指向数组 array 的指针,即指向指针数组的指针。这样,p 就指向了 array 数组的首地址。

3. for (i = 0; i < 5; i++):外层循环,用来控制行数。

4. for (j = 0; j < 5; j++):内层循环,用来控制列数。

在内层循环中,代码使用了(*p)[j][ i]来访问指针数组中的字符串的字符。(*p)[j][ i] 表示 p 指向的数组中的第 j 个字符串的第 i 个字符。现在让我们来解释条件语句 if(i > strlen((*p)[j]) - 1) { break; } 的作用:

这个条件语句的目的是为了确保在输出字符时不越界。由于输出的是倒三角形,每行的字符数递减,因此在一定行数后,某些字符串可能就不足以输出 i+1 个字符,避免访问不存在的内存。

具体来说,strlen((*p)[j]) 表示指针数组中第 j 个字符串的长度。i 是当前外层循环变量,代表行数。因此,i 大于 strlen((*p)[j]) - 1 意味着在第 j 个字符串的长度范围内,该字符串已经没有足够的字符可以输出到第 i+1 列。所以,这时候内层循环就会被中断(通过 break 语句),避免输出越界字符。

综上所述,这个条件语句是为了确保在输出字符时不越界,只输出字符串中实际存在的字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-8 19:48:14 | 显示全部楼层
这段代码是一个嵌套循环,用于打印指针数组中的字符。在这个代码中, array 是一个指针数组,每个元素都是一个指向字符的指针。 p 是一个数组指针,指向指针数组 array 。

在内层循环中, (*p)[j] 表示指针数组中的第j个元素,即一个指向字符的指针。 strlen((*p)[j]) 用于计算该指针指向的字符串的长度。

i 表示外层循环的计数器,用于遍历字符串中的每个字符。 i > strlen((*p)[j]) - 1 表示当 i 大于当前字符串的长度减1时,跳出内层循环。这是因为当 i 大于字符串的长度时,访问字符串中的字符会超出字符串的范围,导致访问非法内存,可能导致程序崩溃。

所以这个判断语句的作用是确保在打印字符之前,先检查当前字符串是否已经结束,如果结束则跳出内层循环,避免访问非法内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 20:07:01 | 显示全部楼层
指针数组与数组指针

好的,让我们来解析一下代码中的 if (i > strlen((*p)[j]) - 1) 的作用。

在这段代码中,char *array[5] 定义了一个指针数组,其中每个元素都是一个指向字符的指针。这意味着 array 是一个数组,每个元素都可以存储一个字符串。

char *(*p)[5] = &array; 则是定义了一个指向指针数组的指针,使得 p 指向了 array 数组。

接下来进入两层嵌套的循环。外层循环控制行数,内层循环控制列数。

i 代表行数,j 代表列数。通过 (*p)[j][i] 可以通过指针数组访问具体字符。

if (i > strlen((*p)[j]) - 1) 则是用来判断是否超过了当前字符串的长度。如果超过了,则跳出内层循环,不再打印后续字符。

这是因为当行数 i 大于当前字符串的长度减1时,说明已经访问到了字符串的末尾。此时没有需要打印的字符,可以直接跳出内层循环。

需要注意的是,字符串中的字符索引是从0开始的,所以长度减1用以判断是否超过末尾字符。

希望能够解答你的疑问!如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-8 20:39:52 | 显示全部楼层
在给定的代码中,内部的两个嵌套循环(`for (i = 0; i < 5; i++)` 和 `for (j = 0; j < 5; j++)`)用于遍历二维字符数组`array`中的元素,并输出特定的字符。

在每个内部循环的起始处,有一个条件判断语句 `if (i > strlen((*p)[j]) - 1)`。它的作用是判断当前元素的字符串长度是否小于`i+1`,即是否还有足够的字符需要打印。如果没有足够的字符需要打印,则跳出当前内部循环,继续外部循环。

假设有以下的二维字符数组:

char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};

当`i=0`时,内部循环会依次遍历`array[0]`, `array[1]`, `array[2]`, `array[3]`和`array[4]`。如果某个元素的字符串长度小于等于`i`,则说明该元素没有足够的字符需要打印,因为下标从0开始。此时,为了避免越界访问或输出无意义的字符,通过跳出当前内部循环,能够确保只打印包含足够字符数量的元素。

因此,这段代码的目的是保证只输出字符串中真实存在的字符,避免出现越界访问或打印无意义的字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-9 09:55:39 | 显示全部楼层    本楼为最佳答案   
这段代码是一个嵌套循环,它的目的是将一个字符串数组中的字符按列输出成一个倒三角形状。让我解释一下这段代码中的那个条件语句:if(i>strlen((*p)[j])-1){break;}

首先,让我们逐步分析代码的作用:

1. char* array[5]:定义了一个包含5个指向字符型指针的数组,每个指针指向一个字符串。

2. char* (*p)[5] = &array:定义了一个指向数组 array 的指针,即指向指针数组的指针。这样,p 就指向了 array 数组的首地址。

3. for (i = 0; i < 5; i++):外层循环,用来控制行数。

4. for (j = 0; j < 5; j++):内层循环,用来控制列数。

在内层循环中,代码使用了(*p)[j][ i]来访问指针数组中的字符串的字符。(*p)[j][ i] 表示 p 指向的数组中的第 j 个字符串的第 i 个字符。现在让我们来解释条件语句 if(i > strlen((*p)[j]) - 1) { break; } 的作用:

这个条件语句的目的是为了确保在输出字符时不越界。由于输出的是倒三角形,每行的字符数递减,因此在一定行数后,某些字符串可能就不足以输出 i+1 个字符,避免访问不存在的内存。

具体来说,strlen((*p)[j]) 表示指针数组中第 j 个字符串的长度。i 是当前外层循环变量,代表行数。因此,i 大于 strlen((*p)[j]) - 1 意味着在第 j 个字符串的长度范围内,该字符串已经没有足够的字符可以输出到第 i+1 列。所以,这时候内层循环就会被中断(通过 break 语句),避免输出越界字符。

综上所述,这个条件语句是为了确保在输出字符时不越界,只输出字符串中实际存在的字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-10 22:49:39 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 07:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表