关于C语言字符串初始化问题的探讨
2016-08-01 10:26
204 查看
关于C语言字符串初始化问题的探讨
code:#include <stdio.h> #include <stdlib.h> int main(){ char str_one[6] = "hello"; char * str_two = "hello"; /* case 0: 正确:char str_one[6] = "hello"; 初始化数组,这个数组的内容是可以修改的。 */ str_one[0] = 'k'; printf("str_one:%s\n",str_one); /* case 1: 错误:运行时错误。 char * str_two = "hello";建立的是一个字符串常量(在内存中),不可修改。 初始化过程:先在内存中新建一个字符串,内容是"hello",然后把这个字符串的首地址给 指针 str_two,建立的字符串"hello"是一个常量,不能被修改。 一旦修改这个字符串就会crash。 str_two[0] = 'k'; printf("str_two:%s\n",str_two); */ /* case 2: 正确 此处用到了指针常量,指针的值不能变,但是指针指向的内容的值可以改变 */ char * const str_three = "hello"; printf("str_three:%s\n",str_three); /* case 3: 错误:运行时错误。 想要对指针常量指向的内容进行修改。 str_three[0] = 'm'; printf("str_three:%s\n",str_three); */ /* case 4: 正确 此处用到了常量指针,指针的值可以改变,但是指针指向的内容的值不能改变 */ const char * str_four = "hello"; printf("str_four:%s\n",str_four); //编译时错误 //str_four[0]='p'; return 0; }
总结:
数组、char * 、char * const 、const char *都能接收 "hello"的首地址,相比较个人认为 : const char * 较好,它能比较准确反映出 "hello"建立的字符串是不可修改的含义。
1.数组形式(char str_one[6] = “hello”;):
可以对字符串进行修改(最特殊),但str_one本身的指针值不能被修改,数组的标识符str_one本身是一个常量,代表 4000 数组的首地址,不可更改、赋值(str_one=xxx)。
2.普通指针形式(char * str_two = “hello”;):
不可以对字符串进行修改,可以对指针本身的值进行改变,比如 str_two=xxx。
3.指针常量形式(char * const str_three = “hello”;):
不可以对字符串进行修改,不能对指针本身的值进行改变。 因为是 xxx = "hello";创建的,所以不能对字符串进行修改(数组形式除外); 因为是指针常量,可以修改字符串内容,不能修改指针常量的值。 综上两点,既不能修改str_three的值,也不能修改字符串的值。
4.常量指针(const char * str_four = “hello”;):
不可以对字符串进行修改,也不能对str_four值进行修改。 因为是 xxx = "hello";创建的,所以不能对字符串进行修改(数组形式除外); 因为是常量指针,所以str_four指针的值可以改变,字符串内容不可变。 综上两点,可以修改str_four的值,但是不能修改字符串的值。
以上仅个人看法,如有错误,敬请指出改正,不胜感激。
相关文章推荐
- C语言中关于字符串左右循环移位的问题
- c语言中关于字符串反转问题
- 关于C语言字符数组、字符串和指针的相关问题
- 关于C语言中用scanf语句输入带有空格字符串问题
- 关于c语言字符串中sizeof指针的问题
- 关于C语言结构体对齐问题的探讨
- C语言---关于scanf读入字符串的一些问题
- C语言关于字符串操作的安全问题
- 关于字符串指针初始化std::string的一个小问题
- 关于C语言判断文件尾问题的探讨
- 关于C语言字符串拼接的一些问题
- C语言中关于字符串的输入问题
- 关于c语言中的字符串问题
- C语言:字符串、结构体中关于数组的几个问题
- C语言:关于计算字符串中空格数的问题
- C语言中字符数组和字符串定义和初始化的问题
- 关于c语言中的字符串的问题
- 关于C语言的文件型指针和移位操作中的一些有趣问题的探讨
- 关于对于c语言全局变量初始化问题
- 关于c语言中double指针的初始化问题