鱼C论坛

 找回密码
 立即注册
查看: 2394|回复: 10

[已解决]指针数组课后作业,萌新求教

[复制链接]
发表于 2022-11-20 22:01:25 | 显示全部楼层 |阅读模式

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

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

x
#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;
}






最佳答案
2022-11-21 00:13:58
本帖最后由 桃花飞舞 于 2022-11-21 00:15 编辑

看不看得懂就看你的了,我也只能表达成这样,
如果不借用编译器的结果,我自己是得不出结果的。
#include <stdio.h>
#include <string.h>

int main()
{
        char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"}; //指针数组,每个元素都是指针,字符串存储在常量区
        char *(*p)[5] = &array;   //这是一个二级指针,(*p)[5]是数组类型的指针
        int i, j;

        for (i = 0; i < 5; i++)
        {
                for (j = 0; j < 5; j++)
                {
                        printf("i = %d  len = %d\n",i,strlen((*p)[j]));
                         //这一步操作是干什么的?能否解释下为何该程序少了这段代码会出现%?
                        if (i > strlen((*p)[j]) - 1)      //strlen((*p)[j])是指的是指针数组每个元素的长度,也就是每个元素中字符的个数,
                                                                //i指的是指针数组char *array[5]中每个元素指向的字符串的第i个字符
                                                                //如果i大于指针数组中指针指向的字符串的字符串总长度,就不打印当前到后面的行的第i列的字符,
                                                                //也就是说第j行的第i列没有字符。再从指针数组的第一个元素(指针)指向的字符串也就是j = 0开始
                        {
                                break;
                        }
                        printf("%c ", (*p)[j][i]);                        //j指的是行,i指的是列
                }
                printf("\n");
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-21 00:13:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 桃花飞舞 于 2022-11-21 00:15 编辑

看不看得懂就看你的了,我也只能表达成这样,
如果不借用编译器的结果,我自己是得不出结果的。
#include <stdio.h>
#include <string.h>

int main()
{
        char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"}; //指针数组,每个元素都是指针,字符串存储在常量区
        char *(*p)[5] = &array;   //这是一个二级指针,(*p)[5]是数组类型的指针
        int i, j;

        for (i = 0; i < 5; i++)
        {
                for (j = 0; j < 5; j++)
                {
                        printf("i = %d  len = %d\n",i,strlen((*p)[j]));
                         //这一步操作是干什么的?能否解释下为何该程序少了这段代码会出现%?
                        if (i > strlen((*p)[j]) - 1)      //strlen((*p)[j])是指的是指针数组每个元素的长度,也就是每个元素中字符的个数,
                                                                //i指的是指针数组char *array[5]中每个元素指向的字符串的第i个字符
                                                                //如果i大于指针数组中指针指向的字符串的字符串总长度,就不打印当前到后面的行的第i列的字符,
                                                                //也就是说第j行的第i列没有字符。再从指针数组的第一个元素(指针)指向的字符串也就是j = 0开始
                        {
                                break;
                        }
                        printf("%c ", (*p)[j][i]);                        //j指的是行,i指的是列
                }
                printf("\n");
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-21 14:05:00 From FishC Mobile | 显示全部楼层
本帖最后由 竹逸 于 2022-11-21 15:27 编辑

求大佬帮我讲解下,我下面的代码为什么是错的

我的理解是:p是一个数组指针,该数组的各个元素是字符型指针,array赋值给p,那p就指向了数组array

p+i:指的是下标为i的元素的地址

那 *(p+i) 就是取下标为 i 元素的值,也就是一个字符型指针,指向了字符串的首地址

那*(*(p+i)+j) 取的就是 i 字符串中下标为 j 的字符

#include<stdio.h>

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

        int i, j;

#if(1)

        for(i=0; i<5 ; i++)
        {
                for(j=0 ; j<strlen(*(p+i)) ; j++)
                {
                        putchar(*(*(p+i)+j));
                }
                putchar('\n');
        }

#endif

#if(0)

        for(j=0 ; j<5 ; j++)
        {
                if(strlen(*(p+j)))
                {
                        printf("%s",*(p+j));
                }
                putchar('\n');
        }

#endif
}
@jackz007 @人造人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-21 16:40:51 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-21 18:18 编辑
竹逸 发表于 2022-11-21 14:05
求大佬帮我讲解下,我下面的代码为什么是错的

我的理解是:p是一个数组指针,该数组的各个元 ...

#include <stdio.h>
#include <string.h>

int main()
{
        const char * array[5] = {"FishC", "Five", "Star", "Good", "Wow"} ; // array 为有 5 个元素的指针数组,就是说,数组元素是指针
                                                                           // array[0]     = "FishC"
                                                                           // array[1]     = "Five"
                                                                           // array[2]     = "Star"
                                                                           // array[3]     = "Good"
                                                                           // array[4]     = "Wow"
        const char * (* p)[5] = & array                                  ; // p 为指向 (*)[5] 末维为 5 的二维指针数组的指针,也就是说,p 是一个三级指针,p 加减 1 的跨度
                                                                           // 是 5 个指针元素,从 p 到 char 需要经过 3 次降级,就是说 p 前面必须出现 3 个 *。
                                                                           // ** p         = p[0][0] = "FishC"
                                                                           // * (* p + 1)  = p[0][1] = "Five"
                                                                           // * (* p + 2)  = p[0][2] = "Star"
                                                                           // * (* p + 3)  = p[0][3] = "Good"
                                                                           // * (* p + 4)  = p[0][4] = "Wow"
        int i , j                                                        ; 
        for(i = 0 ; i < 5 ; i ++)
        {
                for(j = 0 ; j < strlen(* (* p + i)) ; j ++)
                {
                        putchar(*(*(* p + i) + j))                       ;
                }
                putchar('\n')                                            ;
        }

        for(j = 0 ; j < 5 ; j ++)
        {
                if(strlen(* (* p + j)))
                {
                        printf("%s" , * (* p + j))                       ;
                }
                putchar('\n')                                            ;
        }
}

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
竹逸 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-21 19:45:30 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-11-21 16:40

完了,我理解的p是个二级指针,敢明儿我重新复习下数组指针的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-21 23:53:38 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-11-21 16:40

我认真思考了一下,原来我是把array这个数组名当成了整个数组的地址了,它应该是array中第0个元素的地址,&array才是整个数组的地址,然后*p又展开为第0个元素的地址了,怪不得我会把p看成二级指针搞浑了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 00:46:23 | 显示全部楼层
竹逸 发表于 2022-11-21 23:53
我认真思考了一下,原来我是把array这个数组名当成了整个数组的地址了,它应该是array中第0个元素的地址 ...


        p = & array   并不是说  & array才是整个数组的地址,而是因为 array 本身只是一个二级指针,& array 才是一个三级指针,才能和 p 的三级指针属性对等;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 07:04:41 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-11-22 00:46
p = & array   并不是说  & array才是整个数组的地址,而是因为 array 本身只是一个二级指针, ...

char *(*p)[5]和char ***p是不是没有区别?

这里的 5 是不是表明p指向的array数组中有5个元素?

百度了一下,多级指针还可以这样声明,旧版本的课件里就没有这样的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 08:37:23 From FishC Mobile | 显示全部楼层
竹逸 发表于 2022-11-22 07:04
char *(*p)[5]和char ***p是不是没有区别?

这里的 5 是不是表明p指向的array数组中有5个元素?

       代码是现成的,是不是一样你自己一试不就知道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 09:50:00 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-11-22 08:37
代码是现成的,是不是一样你自己一试不就知道了。

嗯,晚上下班了回去试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 14:17:48 | 显示全部楼层
竹逸 发表于 2022-11-21 14:05
求大佬帮我讲解下,我下面的代码为什么是错的

我的理解是:p是一个数组指针,该数组的各个元 ...

p+i:指的是下标为i的元素的地址
sh-5.1$ cat main.c
#include <stdio.h>

int main(void) {
    int i = 123;
    int *pi = &i;
    printf("%p\n", &i);
    printf("%p\n", pi);
    printf("%p\n", pi + 1);
    printf("%p\n", pi + 2);
    printf("%p\n", pi + 3);
    return 0;
}
sh-5.1$ ./main
0x7fffc894ea40
0x7fffc894ea40
0x7fffc894ea44
0x7fffc894ea48
0x7fffc894ea4c
sh-5.1$

pi是一个指针,指向int类型,pi + 1 就是指向下一个int的位置
sh-5.1$ cat main.c
#include <stdio.h>

int main(void) {
    int a[5] = {1, 2, 3, 4, 5};
    int (*pa)[5] = &a;
    printf("%p\n", &a);
    printf("%p\n", pa);
    printf("%p\n", pa + 1);
    printf("%p\n", pa + 2);
    printf("%p\n", pa + 3);
    return 0;
}
sh-5.1$ ./main
0x7ffdde5e1e40
0x7ffdde5e1e40
0x7ffdde5e1e54
0x7ffdde5e1e68
0x7ffdde5e1e7c
sh-5.1$

pa是一个指针,指向数组类型,pa + 1 就是指向下一个数组的位置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 11:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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