c语言中字符数组和字符指针的区别

来源:互联网 发布:java界面设计web控件 编辑:程序博客网 时间:2024/04/25 19:57

在学习c语言的过程中,我们总会遇到许多很相似的,难以分辨的事物,有时犯了错也找不出来,今日偶然看到一点关于字符指针变量和字符数组的区别,希望引以为鉴

字符数组,其实就是字符串,在c语言中,字符数组和字符串视作相同的,字符指针的长度不在于你定义时的指针长度,而是结束符\0存在的位置.你的字符串只有十个字符,那么\0就会出现在第十一个位置视作结束,我们在字符数组的赋值时,只能对子符数组的单个元素赋值,不能对整个数组赋值.例如

char str[]="hello c" /*正确*/

char srt="hello c" /*错误*/

其实,也可以直接对字符数组赋值,要用到strcpy函数,例如

我们把hello.c复制到str子符数组中,要打出

strcpy(str,"hello.c");

才可以

字符指针

我们在对字符指针赋值时,可以直接赋值,例如

char *str;

str="hello.c";

这是完全可以的

在深究,还有很多不同,虽然这两个都是指向字符串的指针,但是

<li class="alt"><span><span class="datatypes">char</span><span>&nbsp;ss[]=</span><span class="string">"C++"</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>ss[0]=<span class="string">'c'</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;合法</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="datatypes">char</span><span>&nbsp;*p=</span><span class="string">"C++"</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>p[0]=<span class="string">'c'</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;合法但不正确</span><span>&nbsp;&nbsp;</span></span></li>

之所以不正确,是因为这两种对字符数组操作不同

使用char *p="C++"语句后,编译器在内存的文字常量区分配一块内存,保存”C++“这一字符串字面值,然后在栈上分配内存保存p,p的内容为"C++"的地址。p[0]='c'试图修改常量”C++“,程序当然就会崩溃了。而char ss[]="C++"语句,定义了一个数组,编译器为其在栈上分配了内存空间,因而可以进行修改操作

总结如下

(1)char ss[]定义了一个数组,ss可认为是一个常指针,ss不可改变,但ss指向的内容可以发生改变。

(2)char *p定义了一个可变指针,p可以指向其它对象。但对于char *p=”abc“这样的情况,p指向的是常量,故内容不能改变

并且,函数类型 *p=&a表示p的初值是a的地址,不是*p初值是a的地址

0 0
原创粉丝点击