通常我们为字符串与字符数组的使用的差异而烦恼,因为一些细小的差别会带来一些莫名其妙的烦恼。
好了,下面就开始谈谈吧,直接进入要点吧,那些基本的就不说了,比如什么末尾'/0'字符,访问越界等一些问题就不必讨论了,学过的C的人都知道怎么会事情。
定义一个字符串的方法:
char *string="xxxxxx";
定义一个字符数组的方法:
char string[]="xxxxxx";
看看下面代码:
void test(char *string)
{
if(string!=NULL)
*string='a';
}
int mian(void)
{
char a[]="abcd";
char *b="abcd";
char *c=NULL;
test(a);//操作合法
test(b);//操作不合法
}
这里发现操作test(b)的时候出错了,其实这里有需要注意的地方,定义一个字符串的时候,通常分配地址是在代码段,字符串有const属性,但是它的指针不具有const属性,所以我们仍然可以让这个指针指向其它地址空间。所以test(b)就不合法了。而字符数组则和普通变量差不多,但是数组名有两重含义,其中一种就是代表字符串的首地址,但是这个地址是个常量,就指向的地址空间不变,指向的内容可变,为了改变其指针属性,可以把这样改变b=a;这样b的地址和指向的内容均可变了。如果c=b,则c相对b的属性没有任何改变。
再看看下面一个例子:
char* test()
{
char a[]="sssssssss";
char *b="sssssssss";
char *c=a;
return a;
//return b;
//return c;
}
int mian(void)
{
char *c=NULL;
c= test();
puts(c);
}
同样都是返回了一个字符串的地址,测试发现 return a和return c的时候有问题,return b却没有问题,这个说明了什么问题呢?呵呵好好体会吧!定义一个字符串有它的特殊属性的。