在用C++的时候,只要一碰到字符串相关的应用就头疼,因此特意写下一篇总结,一来算作学习C++的心得吧,二来也是为了提醒自己,错误不要重复犯。
虽说C++有string类型,无奈我就没有用成功过。所以在此就省去string的心得了。
| 概述区别
我也看了很多博客介绍二者,在此就用我自己的语言复述一遍,加深印象。
其实字符指针和字符数组是差不多的。当二者定义一个字符串时:
char *num = " 123456 ";
char _num[ ] = " 123456 ";
字符串" 123456 "被存放在了一个连续的空间,每个字符都有一个相应的地址,但是若是这样来查找字符岂不是太麻烦。因此我们用字符指针和字符数组来方便我们操作这串字符。
第一行的num是一个指针(注意不是 *num),它存放的是一个地址,即字符串" 123456 "的首地址。 其实正如其名“指针”,它就像一个指针一样,指向了字符串,有一个方向引导的形象。
而_num则是数组的名字,而数组名则默认为数组的首地址。因此_num实际上也是一个地址,指向一个数组。
所以不难发现,当如下调用函数的时候,是没有问题的:
char test ( char *num){
/*...*/
}
void main(){
char _num[ ] = " 123456 " ;
test ( _num );
}
| 赋值区别
1、字符数组赋值字符串:① 直接在定义之后输入;② 用循环一个个赋值; ③ 直接赋值。
① cin >> _num ;
② for ( int i = 0; i < MAX ; i ++){
cin >> _num [ i ];
}
③ char _num [ ] = " 123456 ";
2、字符指针赋值字符串:① 用字符串赋值字符串; ② 直接赋值;
① char _num [ ] = " 123456 ";
char *num ;
num = _num;
② char *num = " 123456 " ;
Tips:
1、字符指针一定要先指向一个确定的地址才能使用。
char *num ;
cin >> num;
错误。因为此时ch还没有指向一个确定的地址,是个野指针。正确的应该是:
char *num, _num [ 80 ];
num = _numr;
cin >> num ;
此时 ch 有了一个确切的地址,即 _num,因此可以直接输入。
同时可以看到,在输入输出的时候,可以直接输入输出字符串名。
2、" 123456 " 这种带引号的字符串本身是一个地址,即 自身的首地址 。
① char _num[ 10 ] ;
_num = " 123456 " ; // error! _num是一个首地址,在数组定义的时候就确定了,为常量。而 " 123456 " 也为一个常量地址。 两个常量不可相互赋值。
② char *num ;
num = " 123456 " ; // correct
现在想到的就这么多啦。
关于C++字符串更深的东西,比如内存分配,可以看看这个 http://blog.sina.com.cn/s/blog_4c70701801015n3t.html 。
以后想起来再补充吧~