说到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","用户名","登录名","密码"};
说实话,我刚开始对这样的定义很是纳闷,为什么?! 我总是认为:既然定义的是指针数组,那数组中的内容为什么不存放指针变量?
后来一想,明白了!(如果还不明白,就慢慢想,还是不明白,就回头看看前面的内容),我想就一切明白了!哈哈!
算了,不写了!以后有空,再写点心得。
我对字符数组/字符串/字符指针的理解!