我对字符数组/字符串/字符指针的理解!

我对字符数组/字符串/字符指针的理解!

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章