C指针新悟!

    指向指针的指针的指针变量 **p,和指针变量之间的赋值.
//例1。
   1 ints(char **a)
   2 {
   3     char *b;
   4     b = (char *)malloc(sizeof(char));
   5     *b = 'a';
   6     *a  = b;
   7     //a = &b;
   8 }
   9 main()
  10 {
  11     char *m;
  12     ints(&m);
  13     printf("%c/n",*m);
  14     free(b);
  15 }

    上例是一个简单的分配内存后赋值的例子,编译运行后打印出a字符,如把第6行注释后把第7行的注释取消,编译运行后打印出的是空。
    再看一个例子
//例2
   1 main()
   2 {
   3     char *b;
   4     char **a;
   5     b = (char *)malloc(sizeof(char));
   6     *b = 'a';
   7     *a  = b;
   8     //a = &b;
   9     printf("%c/n",**a);
  10     free(b);
  11 }
    这个例子和上面的例子差不多,但是无论用*a =b ;编译还是用a = &b;编译都会打印出a 字符。
    编译器不报错说明例1、例2的语法都没有问题,但为什么例1中的7为什么打不出a字符?区别在哪?我们来分析一下例1,
    句子都很简单容易明白,我们主要来看下出现问题的两句,6句中,b为指针变量,它指向一块新分配的内存,该内存的内容为'a' ,而b的值为新分配的内存的地址,当*a = b; 后*a相当于指针变量b,指向的是新内存的地址,而指向指针的指针变量a是通过12语句传进来的指针变量m的地址,那么*a的指向也就是m的指向。那么当运行13句的时候会打印出新内存地址中的数据a.
    而a = &b; a中的内容是指针变量b的地址,也就是a指向了指针变量b,然而b 是在函数ints中的临时变量,当函数ints结束时b被收回了,所以a指向的地址就成了不过预见的了,所以当13句再被运行时m所指的内存的内容已经不是ints中b所指的新内存中的内容了。
    例2中不出现错误的原因也就在这里了,因为指针变量b没有被收回,所以a所指的仍然是指针变量b,而**a表示的也就是新内存地址里的内容了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值