免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5479 | 回复: 15
打印 上一主题 下一主题

[C] 我对字符数组\字符串\字符指针的理解! [复制链接]

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-09 13:27 |只看该作者 |倒序浏览
上午没事干,随便写了一点自己最近一段时间学c的一些心得,望高手不要见笑!哪里写的不对,还请高手们多多指教!

  1. 说到c语言的字符串以及指针字符串,还有字符数组等,开始学习有点懵。
  2. 不过一步一步学来也慢慢理解。
  3. 首先说字符:
  4. 定义一个字符变量:
  5. char c;
  6. 赋值:
  7.   c='a';//也可以这样赋值:scanf("%c",&c);或者这样赋值: c=getchar();
  8. 然后输出:
  9.   printf("%c",c);
  10. 当然也可以这样输出:
  11.   printf("%d",c);//输出字符的十进制;
  12. 另一个函数的输出:
  13.   putchar(c);//一次好像只能输出一个字符;
  14. //==================================================================================
  15. 下面说说通过指针变量给字符变量赋值
  16. 同样定义一个指向字符的指针:
  17.   char *cp;
  18.   char c;
  19.   cp=&c; //将c的地址存入指针变量cp,因为cp是指针变量,所以cp只能存储变量的地址;
  20. 通过指针给变量c赋值:  
  21.   scanf("%c",cp);//因为cp是指向c的一个指针变量,它存储的是c的地址,所以cp前面不用添加取地址符号"&"
  22.                  //特别要注意的是:通过指针给c赋值之前,一定要将c的地址赋值给cp
  23.   printf("%c\n",*cp);
  24. //====================================================================================
  25. 说完字符与字符指针,接着聊聊字符数组
  26. 例如:
  27.      char a[3]={'a','b','c'};//下标也可以省略
  28.      int i;
  29.      //sizeof(a)获得数组的总字节数,sizeof(a[0])获得数组元素的字节数。
  30.      //c语言了好像没有获得数组长度的函数(刚开始学,还找了好半天,哈哈)。不像javascript中length属性就可以获得数组大小
  31.      for(i=0;i<sizeof(a)/sizeof(a[0]);i++)

  32.      {
  33.         printf("%c\n",a[i]);
  34.      }
  35.   接着看看指针与字符数组之间的关系:
  36.   定义一个指针:
  37.    char *p;
  38.    让指针p指向数组:
  39.    p=a;//c语言规定:数组名就是数组的首地址;当然也可以这样复制:p=&a[0];因为a[0]表示数组的第一个元素的值,那么&a[0]就表示数

  40. 组的首地址;
  41.    然后用指针来输出数组各元素的值:
  42.      for(;p<a+3;p++)
  43.      {
  44.         printf("%c\n",*p);
  45.      }
  46.    //刚开始我不明白,为什么a不能a++,经过学习才知道,a在这里是常量,所以就不能改变!
  47.    假如我这样输出:
  48.   printf("%s",p);
  49.    输出结果:abcw
  50.   为什么会输出abcw,而不是abc
  51.   为什么要这样: printf("%s",p); 而不是这样: printf("%s",*p);
  52.   我是这样理解的:
  53.    printf("%s",*p)之所以错误:
  54.    原因有两点,第一,%s表示输出的是字符串,而c语言没有字符串这个基本类型, c语言就规定了字符串的表示是字符数组的末位元素

  55. 以'\0'结束的字符数组;那么字符串abc定义应该为: char a[4]={'a','b','c','\0'};
  56.    第二:printf("%s",*p)中的*p表示p所指向字符数组的第一个元素值'a',,而%s要求以'\0'结束,这样就出现了矛盾,导致错误!
  57.         假如我将字符数组的定义改为:char a[1]={'\0'};然后用printf("%s",*p)去测试一下(这个大家可以测试一下)哈哈!
  58. //=============================================================================================
  59. 写代码过程当中,字符串经常用到,特别是字符串数组。
  60. 如果你写过JavaScript或者ActionScript:字符串数组经常用也比较容易:
  61. 例如:
  62.    js: str=new Array()
  63.         str.push("abc")
  64.         str.push("efg")
  65. 如果按照c语言语法要求:假如要定义一个字符串数组:
  66.     char  title[5][20]={"id","用户名","登录名","密码"};
  67.   这样的定义看起来比较麻烦,而且要浪费空间(第二维的下标必须是所定义的字符串中长度最大的一个);
  68. 这时,就要用到指针数组:
  69.     char *p[4]={"id","用户名","登录名","密码"};
  70.    说实话,我刚开始对这样的定义很是纳闷,为什么?! 我总是认为:既然定义的是指针数组,那数组中的内容为什么不存放指针变量?
  71. 后来一想,明白了!(如果还不明白,就慢慢想,还是不明白,就回头看看前面的内容),我想就一切明白了!哈哈!
  72.   算了,不写了!以后有空,再写点心得。

复制代码

论坛徽章:
0
2 [报告]
发表于 2009-06-09 13:45 |只看该作者
学习方法不错

论坛徽章:
0
3 [报告]
发表于 2009-06-09 17:31 |只看该作者
怎么我没看出什么学习方法?  很简单啊

论坛徽章:
0
4 [报告]
发表于 2009-06-09 17:33 |只看该作者
支持下

论坛徽章:
0
5 [报告]
发表于 2009-06-09 17:40 |只看该作者
原帖由 lvscluster 于 2009-6-9 17:31 发表
怎么我没看出什么学习方法?  很简单啊


善于总结是一种很好的学习方法,对将来是一种很好的积累,工作也是这样。

论坛徽章:
0
6 [报告]
发表于 2009-06-09 18:53 |只看该作者
楼上的错了, 其实人的记性很差,一旦一个时期不做一件事,就会把以前的东西忘记了.如果你每天在做一件事,那么不需要作记录同样明白.

所以结论是:总结不总结,是看你的工作类别,如果类别相同,不需要总结,如果不相同,做了总结也枉然

论坛徽章:
0
7 [报告]
发表于 2009-06-09 19:12 |只看该作者
不要把 sizeof(a)/sizeof(a[0])  写到for里面
有些不聪明的编译器不会优化,每次都会计算,降低效率

论坛徽章:
0
8 [报告]
发表于 2009-06-09 21:52 |只看该作者
别偷 Ctrl+V 这个赖,图省事,好好排排版

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
9 [报告]
发表于 2009-06-09 22:06 |只看该作者

回复 #6 lvscluster 的帖子

有道理!

论坛徽章:
5
未羊
日期:2014-08-07 15:42:10双子座
日期:2014-09-23 15:42:172015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:55:282022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32
10 [报告]
发表于 2009-06-09 22:07 |只看该作者
原帖由 nelab 于 2009-6-9 19:12 发表
不要把 sizeof(a)/sizeof(a[0])  写到for里面
有些不聪明的编译器不会优化,每次都会计算,降低效率

恩!记住了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP