sususususu 发表于 2022-11-20 22:01:25

指针数组课后作业,萌新求教

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

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

      for (i = 0; i < 5; i++)
      {
                for (j = 0; j < 5; j++)
                {
                        if (i > strlen((*p)) - 1)         //这一步操作是干什么的?能否解释下为何该程序少了这段代码会出现%?
                        {
                              break;
                        }
                        printf("%c ", (*p));
                }
                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 = {"FishC", "Five", "Star", "Good", "Wow"}; //指针数组,每个元素都是指针,字符串存储在常量区
      char *(*p) = &array;   //这是一个二级指针,(*p)是数组类型的指针
      int i, j;

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

      return 0;
}

竹逸 发表于 2022-11-21 14:05:00

本帖最后由 竹逸 于 2022-11-21 15:27 编辑

求大佬帮我讲解下,我下面的代码为什么是错的{:5_104:}

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

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

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

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

#include<stdio.h>

void main()
{
      char *array = {"FishC", "Five", "Star", "Good", "Wow"};
      char *(*p) = 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 @人造人

jackz007 发表于 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 = {"FishC", "Five", "Star", "Good", "Wow"} ; // array 为有 5 个元素的指针数组,就是说,数组元素是指针
                                                                           // array   = "FishC"
                                                                           // array   = "Five"
                                                                           // array   = "Star"
                                                                           // array   = "Good"
                                                                           // array   = "Wow"
      const char * (* p) = & array                                  ; // p 为指向 (*) 末维为 5 的二维指针数组的指针,也就是说,p 是一个三级指针,p 加减 1 的跨度
                                                                           // 是 5 个指针元素,从 p 到 char 需要经过 3 次降级,就是说 p 前面必须出现 3 个 *。
                                                                           // ** p         = p = "FishC"
                                                                           // * (* p + 1)= p = "Five"
                                                                           // * (* p + 2)= p = "Star"
                                                                           // * (* p + 3)= p = "Good"
                                                                           // * (* p + 4)= p = "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')                                          ;
      }
}

竹逸 发表于 2022-11-21 19:45:30

jackz007 发表于 2022-11-21 16:40


完了,我理解的p是个二级指针,敢明儿我重新复习下数组指针的内容{:10_247:}

竹逸 发表于 2022-11-21 23:53:38

jackz007 发表于 2022-11-21 16:40


我认真思考了一下,原来我是把array这个数组名当成了整个数组的地址了,它应该是array中第0个元素的地址,&array才是整个数组的地址,然后*p又展开为第0个元素的地址了,怪不得我会把p看成二级指针{:10_266:}搞浑了{:10_247:}

jackz007 发表于 2022-11-22 00:46:23

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

      p = & array   并不是说& array才是整个数组的地址,而是因为 array 本身只是一个二级指针,& array 才是一个三级指针,才能和 p 的三级指针属性对等;

竹逸 发表于 2022-11-22 07:04:41

jackz007 发表于 2022-11-22 00:46
p = & array   并不是说& array才是整个数组的地址,而是因为 array 本身只是一个二级指针, ...

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

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

百度了一下,多级指针还可以这样声明,旧版本的课件里就没有这样的内容{:10_266:}

jackz007 发表于 2022-11-22 08:37:23

竹逸 发表于 2022-11-22 07:04
char *(*p)和char ***p是不是没有区别?

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


       代码是现成的,是不是一样你自己一试不就知道了。

竹逸 发表于 2022-11-22 09:50:00

jackz007 发表于 2022-11-22 08:37
代码是现成的,是不是一样你自己一试不就知道了。

嗯,晚上下班了回去试试{:10_279:}

人造人 发表于 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 = {1, 2, 3, 4, 5};
    int (*pa) = &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 就是指向下一个数组的位置
页: [1]
查看完整版本: 指针数组课后作业,萌新求教