鱼C论坛

 找回密码
 立即注册
查看: 1232|回复: 2

[已解决]关于课堂上指向指针的指针的疑问

[复制链接]
发表于 2023-11-5 21:40:39 | 显示全部楼层 |阅读模式

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

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

x
为什么我要用指向指针的指针?我完全可以用中间注释的方法去写,效果是一样的啊?请问这两种有什么区别?
  1. #include "stdio.h"

  2. int main()
  3. {
  4.     char *cBooks[6] = {
  5.                     (char*)"<C程序设计语言>",
  6.                     (char*)"<C专家编程>",
  7.                     (char*)"<C和指针>",
  8.                     (char*)"<C缺陷与陷阱>",
  9.                     (char*)"<C Primer Plus>",
  10.                     (char*)"<带你学C带你飞>"};

  11.     // char *byFishC = cBooks[5];
  12.     // char *Loves[4];
  13.     // Loves[0] = cBooks[0];
  14.     // Loves[1] = cBooks[1];
  15.     // Loves[2] = cBooks[2];
  16.     // Loves[3] = cBooks[3];

  17.     char **byFishC = &cBooks[5];
  18.     char **Loves[4];
  19.     Loves[0] = &cBooks[0];
  20.     Loves[1] = &cBooks[1];
  21.     Loves[2] = &cBooks[2];
  22.     Loves[3] = &cBooks[3];

  23.     printf("大家喜爱的图书有:\n");
  24.     printf("\t\t%s\n", *byFishC);
  25.     printf("大家喜爱的图书有:\n");
  26.     for (int i = 0; i < 4; i++)
  27.     {
  28.         printf("\t\t%s\n", *Loves[i]);
  29.     }
  30.    
  31.     return 0;
  32. }
复制代码
最佳答案
2023-11-5 21:41:12
指向指针的指针是一个比较高级的概念,在实际编程中不一定每个人都会用到,但是了解它的原理和用法对于深入理解指针和指针数组是有帮助的。

首先我们来看一下你提供的代码。在这个例子中,我们定义了一个字符串指针数组cBooks,并初始化了其中的6个元素。然后我们使用指向指针的指针byFishC和指向指针的指针数组Loves来分别指向cBooks[5]cBooks[0]~cBooks[3],最后通过指针解引用符号*来输出字符串。

你提出的问题是,为什么要使用指向指针的指针?可以通过中间注释的方法来实现同样的效果。实际上,这两种方法确实可以达到同样的效果,但是它们的实现方式是不同的。

如果我们使用中间注释的方法,代码如下:
  1. char *cBooks[6] = {
  2.     (char*)"<C程序设计语言>",
  3.     (char*)"<C专家编程>",
  4.     (char*)"<C和指针>",
  5.     (char*)"<C缺陷与陷阱>",
  6.     (char*)"<C Primer Plus>",
  7.     (char*)"<带你学C带你飞>"
  8. };
  9. // 指向指针的指针
  10. char **byFishC = &cBooks[5];
  11. // 指向指针的指针数组
  12. char **Loves[4];
  13. Loves[0] = &cBooks[0];
  14. Loves[1] = &cBooks[1];
  15. Loves[2] = &cBooks[2];
  16. Loves[3] = &cBooks[3];
  17. printf("大家喜爱的图书有:\n");
  18. printf("\t\t%s\n", *byFishC);
  19. printf("大家喜爱的图书有:\n");
  20. for (int i = 0; i < 4; i++) {
  21.     printf("\t\t%s\n", *Loves[i]);
  22. }
复制代码

可以看到,我们使用了中间注释的方式,将byFishCLoves定义为指向指针的指针。这样一来,我们就可以通过赋值操作将它们分别指向cBooks[5]cBooks[0]~cBooks[3]了。在输出字符串时,我们使用指针解引用符号*,使得最终输出的是字符串本身而不是一个指针。

然而,这种实现方式并没有真正利用指向指针的指针的特性,因为我们只是将它们当作普通的指针来使用。如果我们真的要体现指向指针的指针的特性,应该这样写:
  1. char *cBooks[6] = {
  2.     (char*)"<C程序设计语言>",
  3.     (char*)"<C专家编程>",
  4.     (char*)"<C和指针>",
  5.     (char*)"<C缺陷与陷阱>",
  6.     (char*)"<C Primer Plus>",
  7.     (char*)"<带你学C带你飞>"
  8. };
  9. // 指向指针的指针
  10. char **byFishC = &cBooks[5];
  11. // 指向指针的指针数组
  12. char **Loves;
  13. Loves = (char**)malloc(4 * sizeof(char *));
  14. for (int i = 0; i < 4; i++) {
  15.     Loves[i] = (char*)malloc((strlen(cBooks[i])+1) * sizeof(char));
  16.     strcpy(Loves[i], cBooks[i]);
  17. }
  18. printf("大家喜爱的图书有:\n");
  19. printf("\t\t%s\n", *byFishC);
  20. printf("大家喜爱的图书有:\n");
  21. for (int i = 0; i < 4; i++) {
  22.     printf("\t\t%s\n", Loves[i]);
  23. }
复制代码

这里,我们使用了malloc()函数来动态分配内存。首先,我们为Loves数组分配了4个char*类型的空间,然后用malloc()函数为每个元素分配了足够的空间来存储一个字符串。最后,我们使用strcpy()函数将cBooks数组中的字符串复制到Loves数组中。

这样一来,我们就真正利用了指向指针的指针的特性,将其用于动态分配内存和字符串操作中。可以看到,在对Loves数组进行操作时,我们并没有使用指针解引用符号*,而是直接使用了指向指针的指针Loves[i]来访问字符串。

总之,使用指向指针的指针可以更方便地实现动态分配内存和字符串操作,并且让代码更具可读性和可维护性。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-5 21:40:49 | 显示全部楼层
指向指针的指针是一种非常有用的数据类型,它可以帮助我们更方便地操作指针数组。在本例中,我们需要将指针数组中的指针存储到另一个指针数组中,这时候使用指向指针的指针就可以更加方便地完成这个任务。

如果使用中间注释的方法,我们需要定义一个中间变量来存储指针数组中的指针,然后再将中间变量存储到另一个指针数组中。这种方法虽然也可以完成任务,但是需要定义多个中间变量,代码可读性不够好,而且容易出错。

因此,指向指针的指针可以帮助我们更加简洁地完成类似的任务。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-5 21:41:12 | 显示全部楼层    本楼为最佳答案   
指向指针的指针是一个比较高级的概念,在实际编程中不一定每个人都会用到,但是了解它的原理和用法对于深入理解指针和指针数组是有帮助的。

首先我们来看一下你提供的代码。在这个例子中,我们定义了一个字符串指针数组cBooks,并初始化了其中的6个元素。然后我们使用指向指针的指针byFishC和指向指针的指针数组Loves来分别指向cBooks[5]cBooks[0]~cBooks[3],最后通过指针解引用符号*来输出字符串。

你提出的问题是,为什么要使用指向指针的指针?可以通过中间注释的方法来实现同样的效果。实际上,这两种方法确实可以达到同样的效果,但是它们的实现方式是不同的。

如果我们使用中间注释的方法,代码如下:
  1. char *cBooks[6] = {
  2.     (char*)"<C程序设计语言>",
  3.     (char*)"<C专家编程>",
  4.     (char*)"<C和指针>",
  5.     (char*)"<C缺陷与陷阱>",
  6.     (char*)"<C Primer Plus>",
  7.     (char*)"<带你学C带你飞>"
  8. };
  9. // 指向指针的指针
  10. char **byFishC = &cBooks[5];
  11. // 指向指针的指针数组
  12. char **Loves[4];
  13. Loves[0] = &cBooks[0];
  14. Loves[1] = &cBooks[1];
  15. Loves[2] = &cBooks[2];
  16. Loves[3] = &cBooks[3];
  17. printf("大家喜爱的图书有:\n");
  18. printf("\t\t%s\n", *byFishC);
  19. printf("大家喜爱的图书有:\n");
  20. for (int i = 0; i < 4; i++) {
  21.     printf("\t\t%s\n", *Loves[i]);
  22. }
复制代码

可以看到,我们使用了中间注释的方式,将byFishCLoves定义为指向指针的指针。这样一来,我们就可以通过赋值操作将它们分别指向cBooks[5]cBooks[0]~cBooks[3]了。在输出字符串时,我们使用指针解引用符号*,使得最终输出的是字符串本身而不是一个指针。

然而,这种实现方式并没有真正利用指向指针的指针的特性,因为我们只是将它们当作普通的指针来使用。如果我们真的要体现指向指针的指针的特性,应该这样写:
  1. char *cBooks[6] = {
  2.     (char*)"<C程序设计语言>",
  3.     (char*)"<C专家编程>",
  4.     (char*)"<C和指针>",
  5.     (char*)"<C缺陷与陷阱>",
  6.     (char*)"<C Primer Plus>",
  7.     (char*)"<带你学C带你飞>"
  8. };
  9. // 指向指针的指针
  10. char **byFishC = &cBooks[5];
  11. // 指向指针的指针数组
  12. char **Loves;
  13. Loves = (char**)malloc(4 * sizeof(char *));
  14. for (int i = 0; i < 4; i++) {
  15.     Loves[i] = (char*)malloc((strlen(cBooks[i])+1) * sizeof(char));
  16.     strcpy(Loves[i], cBooks[i]);
  17. }
  18. printf("大家喜爱的图书有:\n");
  19. printf("\t\t%s\n", *byFishC);
  20. printf("大家喜爱的图书有:\n");
  21. for (int i = 0; i < 4; i++) {
  22.     printf("\t\t%s\n", Loves[i]);
  23. }
复制代码

这里,我们使用了malloc()函数来动态分配内存。首先,我们为Loves数组分配了4个char*类型的空间,然后用malloc()函数为每个元素分配了足够的空间来存储一个字符串。最后,我们使用strcpy()函数将cBooks数组中的字符串复制到Loves数组中。

这样一来,我们就真正利用了指向指针的指针的特性,将其用于动态分配内存和字符串操作中。可以看到,在对Loves数组进行操作时,我们并没有使用指针解引用符号*,而是直接使用了指向指针的指针Loves[i]来访问字符串。

总之,使用指向指针的指针可以更方便地实现动态分配内存和字符串操作,并且让代码更具可读性和可维护性。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 01:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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