美文网首页
C语言:解析字符串的存储char *str和char str[]

C语言:解析字符串的存储char *str和char str[]

作者: Bfmall | 来源:发表于2023-08-21 18:48 被阅读0次

    首先我们需要知道主要的数据存储位置

    1、栈(动态存储方式,如局部变量,用完自动销毁)
    2、堆(如malloc申请内存,用完需要手动回收内存)
    3、静态存储区(静态存储方式,全局变量和静态变量,程序开始就一直存在)
    4、常量存储区(里面存放的是常量,不允许修改)

    有这些基本知识后,接下来进一步分析

    char *str = "hello";
    

    解析:
    str是一个char型指针变量,它指向常量”hello”字符串所在的首地址
    ①:变量str保存在栈上
    ②:常量”hello”即保存在常量存储区

    恩,我想把第一个字符改成’a’

    *str='a';
    

    很明显,这样会报错,因为常量不能改变,”hello”保存在内存常量区,程序编译完成时,这个值就确定了不能改变。

    接下来

    char str[] = "hello";
    

    解析:
    str是数组名,它是一个指针,指向变量”hello”字符串的首地址
    ①:str我们把它理解是数组名,是一个指针常量(注意不是变量,只是数组名的命名方法和变量一样!!)
    ②:字符串”hello”,保存在栈上

    恩,我自增一下

    str++;
    

    很明显,str++;是错误的语法,因为不是变量(这里需要注意:char str[] 作参数时,char str[]是当做char *str使用,即str++不会报错 )

    str+1;
    

    str+1;是没问题,因为str是指针,所以+1就是偏移char个宽度,指向下一个字节的地址

    &str
    

    &str对数组名取地址,即&str是代表整个数组的地址。&str是一个宽度是数组的长度(即sizeof(str))的指针。

    *str='a';
    

    改变第一个字符的值,因为是变量,没问题。字符成为“aello”

    相关文章

      网友评论

          本文标题:C语言:解析字符串的存储char *str和char str[]

          本文链接:https://www.haomeiwen.com/subject/qqzlmdtx.html