c语言中字符数组和字符指针的区别
2016-02-29 20:09
405 查看
在学习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> ss[]=</span><span class="string">"C++"</span><span>; </span></span></li><li class=""><span>ss[0]=<span class="string">'c'</span><span>; </span><span
class="comment">// 合法</span><span> </span></span></li><li class="alt"><span><span class="datatypes">char</span><span> *p=</span><span class="string">"C++"</span><span>; </span></span></li><li class=""><span>p[0]=<span class="string">'c'</span><span>; </span><span
class="comment">// 合法但不正确</span><span> </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的地址
字符数组,其实就是字符串,在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> ss[]=</span><span class="string">"C++"</span><span>; </span></span></li><li class=""><span>ss[0]=<span class="string">'c'</span><span>; </span><span
class="comment">// 合法</span><span> </span></span></li><li class="alt"><span><span class="datatypes">char</span><span> *p=</span><span class="string">"C++"</span><span>; </span></span></li><li class=""><span>p[0]=<span class="string">'c'</span><span>; </span><span
class="comment">// 合法但不正确</span><span> </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的地址
相关文章推荐
- C++中输入带有空格的字符串
- 【c/c++】算法的时间复杂度和空间复杂度
- 算法代码实现之快速排序,C/C++实现
- C/C++ union用法
- 深入c++ new
- c++静态库与动态库的区别
- C/C++存储类型及作用域规则
- opencl:C++ 利用cl::make_kernel简化kernel执行代码
- VC++更改程序图标
- C语言指针
- C++多态与指针的强制转换
- 为什么学C++比C#的长期风险低
- 2012年第三届蓝桥杯C/C++省赛 微生物增殖
- c++类的隐式转换与强制转换重载详解
- C++虚基类的实现机制
- c++ 虚函数的实现机制
- C++对象模型笔记:对象的三种内存布局
- C++ sort函数的用法
- 【POJ 3630】Phone List 中文题意&题解&代码(C++)
- C++的个人真实学习经验