C指针案例分析

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

void read_slogan(FILE *fp, char **slogan)
{
      char buf[1024];
       int i;
      for (i = 0; i < 7; i++) {
            fgets(buf, 1024, fp);
            /*删除换行字符*/
            buf[strlen(buf)-1] = '\0';
            /*分配保存一个标语的内存空间*/
            slogan[i] = malloc(sizeof(char) * (strlen(buf) + 1));
            /*复制标语的内容*/
            strcpy(slogan[i], buf);
       }
 }

 int main(void)
 {
       char *slogan[7];
       int i;
       read_slogan(stdin, slogan);
       /*输出读取的标语*/
       for (i = 0; i < 7; i++) {
              printf("%s\n", slogan[i]);
       }
       return 0;
 }

       这段代码来自《征服C指针》第四章4.2节4.2.1小节4-5代码清单。从网上找的电子版《征服C指针》在这一块有些错误。我看的那版电子版的《征服C指针》关于read_slogan写的是void read_slogan(FILE fp, char *slogan),这里的形参定义让我迷惑了好一阵。后来看了书才发现电子版的书有错误。本来指针对新手来说就不太好理解,看了这本有错误的电子版《征服C指针》搞得我更糊涂了。这里就来分析一下void read_slogan(FILE fp, char *slogan)中char *slogan为什么不对。

       这段代码是在被调用函数read_slogan中分配内存并得到内存地址,然后通过被调用函数read_slogan把这块区域返回给主调用函数main。在被调用函数read_slogan中分配的是字符数组,要分配7个字符数组,用for循环表示的,每一次循环分配一个字符数组,并返回这个字符数组的地址。字符数组的地址是一级指针。我们要把这7个一级指针返回给主调函数main,就需要在main函数中定义7个变量,由于这7个变量存放7个一级指针,而变量的级数是由他存放的内容的级数决定的,因此在main函数中要分配7个一级指针,也就是一个有7个元素的指针数组 char *slogan[7];,数组的每一个元素存放一个一级指针。又因为是从被调用函数中去给这个数组赋值,所以需要将这个数组 char *slogan[7]的地址传给被调用函数read_slogan。由于数组存放的是一级指针,那么数组的地址就是二级指针。所以read_slogan的形参应该定义为二级指针,而不是错误的电子书上写的那样是一个一级指针形参。

       这里的分析可以查看我的上一篇博客https://mp.csdn.net/postedit/90896587

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值