指向指针的指针 char **使用技巧

需求:

因为需要定义一个字符串数组,用来存放多个字符串,于是想到使用 char **这种结构——指向指针的指针,于是编写代码如下:

[html]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int main()  
  5. {  
  6. char * * ch;  
  7. char * p = "abcdsdfsdfsfsfsdfs";  
  8. char * q = "def";  
  9. ch=(char **)malloc(2*sizeof(char *));  
  10. *ch = p;  
  11. *(ch+1) = q;  
  12. printf("%s\n",**ch);  
  13.   
  14. return EXIT_SUCCESS;  
  15. }  

预想的是程序会输出 “abcdsdfsdfsfsfsdfs”这个字符串,因为:

由上面的图可以看出,*ch = p;这条语句执行之后,ch地址处存放的值就变成了 0x8000 即第一个字符串的地址,当执行到输出语句时:

[html]  view plain copy
  1. printf("%s\n",**ch);  
*ch指向的是0x8000,那么 **ch指向的就应该是 0x8000里面存放的字符串了。

这样理解之后,运行,结果惊讶!

[html]  view plain copy
  1. Output:  
  2. Segmentation fault  
提示段错误。这就奇了怪了。

仔细分析,这一定是内存错误,

不妨换一种输出格式,随便试试,于是改了代码如下:

[html]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int main()  
  5. {  
  6. char * * ch;  
  7. char * p = "abcdsdfsdfsfsfsdfs";  
  8. char * q = "def";  
  9. ch=(char **)malloc(2*sizeof(char *));  
  10. *ch = p;  
  11. *(ch+1) = q;  
  12.   
  13. <span style="color:#FF0000;">printf("%s\n%s\n%s\n",p,ch,*ch);</span> //红色为修改的部分  
  14.   
  15. return EXIT_SUCCESS;  
  16. }  
此时,输出结果为:

[html]  view plain copy
  1. abcdsdfsdfsfsfsdfs  
  2. ���  
  3. abcdsdfsdfsfsfsdfs  
  4.   
  5. 明显是 p 和 *ch表示相同的值, 而 ch输出为乱码,应该表示的是地址!   
再换一种输出格式,全部都已地址,即数字的格式:

[html]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int main()  
  5. {  
  6. char * * ch;  
  7. char * p = "abcdsdfsdfsfsfsdfs";  
  8. char * q = "def";  
  9. ch=(char **)malloc(2*sizeof(char *));  
  10. *ch = p;  
  11. *(ch+1) = q;  
  12.   
  13. <span style="color:#FF0000;">printf("%d\n%d\n%d\n",p,ch,*ch);</span>//红色表示修改的部分  
  14.   
  15. return EXIT_SUCCESS;  
  16. }  
输出结果为:
[html]  view plain copy
  1. 134514184  
  2. 134520952  
  3. 134514184  
哦,原来这样,p和 *ch既能输出字符串又能输出地址。此时,结合现有成果和已有知识,猛然知道:

其实 %s 输出的字符串是,由参数表示的地址处的字符开始输出,直到 遇到字符串结束符‘\0’,而 %d只是输出地址。

并不是以前我以为的 输出的值相同只是格式不同 ,以前我以为 输出十进制数就是把字符串都变成了十进制数,这是多么严重的一个错误哇!

这样一切就清楚了。

总结:在编程序的时候,如果发现错了,但是,一时又找不出来哪里有问题的时候,我们不妨多试试,用相近的代码多多尝试,不一定哪次就来灵感了呢,而且,一定要剔除自己的成见,比如,我的这个程序里面 我想当然以为 输出的值都应该是相同的。多多练习,就会发现越来越多的问题,这样也能让自己的只是掌握的更加熟练,更加准确。还有就不不要懒,该编程运行看效果的时候就得编程,该画图标识的时候就得画图,另外,我觉得codepad在线编译器确实不错,极大的简便了编译过程,自从用了gcc之后,我就没用过 MS的 vc6.0 之类的了,windows平台的那种软件一天能死N次。


转载原地址http://blog.csdn.net/chenglibin1988/article/details/8740858

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值