|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
为什么我要用指向指针的指针?我完全可以用中间注释的方法去写,效果是一样的啊?请问这两种有什么区别?
- #include "stdio.h"
- int main()
- {
- char *cBooks[6] = {
- (char*)"<C程序设计语言>",
- (char*)"<C专家编程>",
- (char*)"<C和指针>",
- (char*)"<C缺陷与陷阱>",
- (char*)"<C Primer Plus>",
- (char*)"<带你学C带你飞>"};
- // char *byFishC = cBooks[5];
- // char *Loves[4];
- // Loves[0] = cBooks[0];
- // Loves[1] = cBooks[1];
- // Loves[2] = cBooks[2];
- // Loves[3] = cBooks[3];
- char **byFishC = &cBooks[5];
- char **Loves[4];
- Loves[0] = &cBooks[0];
- Loves[1] = &cBooks[1];
- Loves[2] = &cBooks[2];
- Loves[3] = &cBooks[3];
- printf("大家喜爱的图书有:\n");
- printf("\t\t%s\n", *byFishC);
- printf("大家喜爱的图书有:\n");
- for (int i = 0; i < 4; i++)
- {
- printf("\t\t%s\n", *Loves[i]);
- }
-
- return 0;
- }
复制代码
指向指针的指针是一个比较高级的概念,在实际编程中不一定每个人都会用到,但是了解它的原理和用法对于深入理解指针和指针数组是有帮助的。
首先我们来看一下你提供的代码。在这个例子中,我们定义了一个字符串指针数组 cBooks,并初始化了其中的6个元素。然后我们使用指向指针的指针 byFishC和指向指针的指针数组 Loves来分别指向 cBooks[5]和 cBooks[0]~cBooks[3],最后通过指针解引用符号 *来输出字符串。
你提出的问题是,为什么要使用指向指针的指针?可以通过中间注释的方法来实现同样的效果。实际上,这两种方法确实可以达到同样的效果,但是它们的实现方式是不同的。
如果我们使用中间注释的方法,代码如下:
- char *cBooks[6] = {
- (char*)"<C程序设计语言>",
- (char*)"<C专家编程>",
- (char*)"<C和指针>",
- (char*)"<C缺陷与陷阱>",
- (char*)"<C Primer Plus>",
- (char*)"<带你学C带你飞>"
- };
- // 指向指针的指针
- char **byFishC = &cBooks[5];
- // 指向指针的指针数组
- char **Loves[4];
- Loves[0] = &cBooks[0];
- Loves[1] = &cBooks[1];
- Loves[2] = &cBooks[2];
- Loves[3] = &cBooks[3];
- printf("大家喜爱的图书有:\n");
- printf("\t\t%s\n", *byFishC);
- printf("大家喜爱的图书有:\n");
- for (int i = 0; i < 4; i++) {
- printf("\t\t%s\n", *Loves[i]);
- }
复制代码
可以看到,我们使用了中间注释的方式,将 byFishC和 Loves定义为指向指针的指针。这样一来,我们就可以通过赋值操作将它们分别指向 cBooks[5]和 cBooks[0]~cBooks[3]了。在输出字符串时,我们使用指针解引用符号 *,使得最终输出的是字符串本身而不是一个指针。
然而,这种实现方式并没有真正利用指向指针的指针的特性,因为我们只是将它们当作普通的指针来使用。如果我们真的要体现指向指针的指针的特性,应该这样写:
- char *cBooks[6] = {
- (char*)"<C程序设计语言>",
- (char*)"<C专家编程>",
- (char*)"<C和指针>",
- (char*)"<C缺陷与陷阱>",
- (char*)"<C Primer Plus>",
- (char*)"<带你学C带你飞>"
- };
- // 指向指针的指针
- char **byFishC = &cBooks[5];
- // 指向指针的指针数组
- char **Loves;
- Loves = (char**)malloc(4 * sizeof(char *));
- for (int i = 0; i < 4; i++) {
- Loves[i] = (char*)malloc((strlen(cBooks[i])+1) * sizeof(char));
- strcpy(Loves[i], cBooks[i]);
- }
- printf("大家喜爱的图书有:\n");
- printf("\t\t%s\n", *byFishC);
- printf("大家喜爱的图书有:\n");
- for (int i = 0; i < 4; i++) {
- printf("\t\t%s\n", Loves[i]);
- }
复制代码
这里,我们使用了 malloc()函数来动态分配内存。首先,我们为 Loves数组分配了4个 char*类型的空间,然后用 malloc()函数为每个元素分配了足够的空间来存储一个字符串。最后,我们使用 strcpy()函数将 cBooks数组中的字符串复制到 Loves数组中。
这样一来,我们就真正利用了指向指针的指针的特性,将其用于动态分配内存和字符串操作中。可以看到,在对 Loves数组进行操作时,我们并没有使用指针解引用符号 *,而是直接使用了指向指针的指针 Loves[i]来访问字符串。
总之,使用指向指针的指针可以更方便地实现动态分配内存和字符串操作,并且让代码更具可读性和可维护性。
球一个最佳答案谢谢啦!这对我非常重要!  
|
|