关于C语言字符串初始化问题的探讨

关于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本身是一个常量,代表数组的首地址,不可更改、赋值(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的值,但是不能修改字符串的值。

以上仅个人看法,如有错误,敬请指出改正,不胜感激。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值