您的位置:首页 > 编程语言 > C语言/C++

关于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的值,但是不能修改字符串的值。


以上仅个人看法,如有错误,敬请指出改正,不胜感激。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: