c: string 字符指针与字符数组的区分
2017-11-21 22:33
211 查看
来看一段简单的代码,以区分字符指针与字符数组在表达字符串时的一些区别。
输出如下:
Kotlin
Jotlin
看到这个输出以及注释,为什么
ps: 在部分编译器上面不会报错,也能修改成功。但是这种行为是
首先,这两种方式是有本质区别的:第一种:使用指针去初始化一个字符串,实际上系统只开辟了一个字符指针的空间,字符串还是存储在静态存储区,所以,如果做修改,就会修改静态存储区的
正是因为一个是指向,一个是拷贝副本,所以,一个只能读,不能写;而另一个可读可写。
ps: 如果想使用字符指针来表达一个可读性的字符串,就需要先
#include <stdio.h> #include <string.h> int main(int argc, char const *argv[]) { char * str = "Kotlin"; // str[0] = 'J'; // Bus error:10 puts(str); char string[10] = "Kotlin"; string[0] = 'J'; // ok puts(string); return 0; }
输出如下:
Kotlin
Jotlin
看到这个输出以及注释,为什么
// str[0] = 'J'; // Bus error:10这一句会报错呢?
ps: 在部分编译器上面不会报错,也能修改成功。但是这种行为是
c标准未定义的,依赖于编译器自己的实现。
首先,这两种方式是有本质区别的:第一种:使用指针去初始化一个字符串,实际上系统只开辟了一个字符指针的空间,字符串还是存储在静态存储区,所以,如果做修改,就会修改静态存储区的
"Kotlin",这当然是不合理的,因为这会导致,你系统中所有的
"Kotion"都会被改成
"Jotlin";而字符数组就不会,这种方式去初始化一个字符串,实际上是拷贝了这个字符串的一个副本。这样你随意修改并不会影响系统中其他地方对这个字符串的正常使用。
正是因为一个是指向,一个是拷贝副本,所以,一个只能读,不能写;而另一个可读可写。
ps: 如果想使用字符指针来表达一个可读性的字符串,就需要先
malloc(size),然后
strcpy(dest,src);这样也就做到了拷贝副本的行为。
相关文章推荐
- 关于C中字符数组,字符指针以及C++中string类型的两两转换及排序
- 把vector中的string对象导入到字符指针数组中
- 用string类型的vector对象创建一个字符指针数组
- 编写程序读入一组string类型的数据,并将它们存储在vector中,再将vector对象复制给一个字符指针数组。
- 关于字符数组与字符串指针的区分
- leetcode -- 557. Reverse Words in a String III 【字符反转 + 字符数组 + 双指针 + 状态记录】
- 【编程练习】将string容器保存在字符指针数组中
- 字符串常量保存问题与字符数组和字符指针区分
- Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)
- Delphi的字符(Char), 字符串(String), 字符串指针( PChar ), 字符数组 array of char
- 字符串string 字符数组与指向字符串的指针pchar的区别与联系
- 区分 :字符指针变量和字符数组的区别和联系
- 有一段文本,将文本中的所有单词,存放到一个字符指针数组中(要求每个单词内存恰好)
- 字符数组与字符指针
- 字符串指针与字符数组的区别
- 字符数组和字符指针
- [转]字符数组,字符指针,Sizeof总结
- 字符串,字符指针和字符数组的sizeof和strlen
- 三行代码搞定字符数组与字符指针的区别
- 指针 数组 string 与sizeof strlen