转自:http://www.baihowff.com/post/140.html
在C/C++中,指针是一个永远值得关心的东西.很强大很危险!而数组呢?则在很多地方可以和指针互相替换,又是给人错觉,觉得是一样的,当然...他们不会一样的.
1.定义
在定义数组时,比如char str[10];的时候,str指向的这10个储存单元就一直都被str所指向,不会改变.而且这些单元会在静态区创建.
定义指针时,比如char *pStr=NULL;那么这个指针是可以随时变化的,也许你会这个时候指向char a,也许过一会就指向char b了,指针比数组灵活很多,当然,代价是危险.
2.初始化
这点其实很特殊,也是很忽悠人的地方,为什么呢?看看这样两个定义:
char a[] = "hello";
char *p = "world";
不错,第一个是字符数组,第二个呢?字符串指针?对也不对,首先他当然是指针,但是他指向的是一个常量字符串.等效于
const char p[]="world";
但是注意哦~~这不意味着指针就是字符串哦~~~别真被忽悠了,其实如果真的要定义指针所指向的字符串最好这样:
char *p=new char[10];
然后用strcpy进行赋值.当然也可以*p='a';*(p+1)='b';....不过有点傻....而且要记得最后一个要赋值成'/0'哦...要不就错了列....
3.请使用库函数
当你使用字符串连接,赋值的时候要注意哦,当然我在这里说的是char数组的字符串,而不是那些CString类的时候(因为这些类都把很多东西重载过了).这种时候就应该使用库函数,比如strcpy,strcat,strcmp等等...而不要直接用赋值号了,也不要直接加减比较.那样基本都是错的(极个别的也是对的).
4.注意sizeof
sizeof是很有趣的东西.首先我们要明确,char字符串最后一位是'/0',所以对于sizeof("hello")的计算结果是6.但是strlen("hello")的返回值是5.(注意:sizeof是算符,所以我说的是计算结果.strlen是函数,所以我说是返回值).好了,下面说说我想说的正题:
我们想定义几个东西,这样好说明点:
char a[]="hello";
const char b[]="hello";
char *c="hello";
const char *d="hello";
呵呵...先问你一下...这几个有区别么?当然如果你只想输出一下,没啥区别.那么sizeof(a),sizeof(b),sizeof(c),sizeof(d)呢?都是6?当然不是,前两个是6,后面两个是4....why?因为如果是数组,就会把全部的长度计入的,也就是说sizeof(a)表示就是sizeof(char)*6,而指针的固定长度就是4,无论什么类型,void*,和double*都是4...
另外,c的定义方法是最不好的一种,这样定义的字符串,是不能修改的,但是编译的时候不会提示,很要命...千万别这样玩...