[C]字符串数据在C中的存储方式:


内存中的五大区域:

  1. 栈:是专门用来存储局部变量的,所有的局部变量都是声明在栈区域中

  2. 堆:允许程序员手动的从堆申请指定字节数的空间来使用

  3. BSS段:是用来存储未初始化的全局变量和静态变量,声明一个全局变量,如果我们没有初始化,在程序运行最开始的时候,这个全局变量是没有初始化的,存储在BSS段【程序运行后系统就自动的初始化为0,并把初始化后的全局变量存储在数据段中】

  4. 数据段/常量区:用来存储已经初始化的全局变量、静态变量和常量数据

  5. 代码段:用来存储程序的代码/指令


字符串数据在C语言中有两种存储方式:

  1. 使用字符数组来存储:将字符串数据的每一个字符存储到字符数组中,并追加一个’\0’代表存储结束
    char name[]=“jack”;

  2. 使用字符指针来存储字符串数据:直接将一个字符串数据初始化给一个字符指针
    char* name =“jack”;


1)当它们都是局部变量的时候:

字符数组是申请在栈区,字符串的每一个字符存储在这个字符数组的每一个元素中;
指针变量是声明在栈区的,字符串数据是以字符数组的形式存储在常量区的,指针变量中存储的是字符串在常量区的地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sSVOpFkH-1607333005573)(B8967AD2-0321-450A-B2E9-2F9F6D302022.png)]

2)当它们作为全局变量的时候:

字符数组是存储在常量区的,字符串的每一个字符存储在这个字符数组的每一个元素中;
指针变量也是存储在常量区的,字符串数据是以字符数组的形式存储在常量区的,指针变量中存储的是字符串在常量区的地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GFXlQtUZ-1607333005574)(96C2AEB6-59C4-4046-AFCA-FD61D4323CE3.png)]

3)
以字符数组的形式存储字符串数据,不管是全局的还是局部的,都可以使用下标去修改字符数组中的每一个元素;
以字符指针的形式存储字符串数据,不管是全局的还是局部的,都不能通过指针去修改指向的字符串数据

当我们以字符指针的形式要将字符串数据存储到常量区的时候,并不是直接将字符串存储到常量区,而是先检查常量区中是否有相同内容的字符串,如果有直接将这个字符串的地址拿过来返回,如果没有,才会将这个字符串数据存储在常量区中

当我们重新为字符指针初始化一个字符串的时候,并不是修改原来的字符串,而是重新的创建了一个字符串,把这个新的字符串的地址赋值给它
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJdOYHAT-1607333005576)(6150B9E9-B65F-46C2-8F45-CF3A6728AEAD.png)]


几个比较容易混的点:

  1. 这样是可以的,但是不是把“jack”改成了“rose”,而是重新创建了一个“rose”,把“rose”的地址赋值给name
    char *name = "jack";
    name = "rose";

  2. 这样是不行的,name是数组名,代表数组的地址,不能为数组名赋值
    char name[]="jack";
    name = "rose";

  3. 这样做是可以的,直接修改数组的元素
    name[0]='r';
    name[1]='o';
    name[2]='s';
    name[3]='e';
    name[4]='\0';


统计字符串中某一个字符出现的次数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzzxhMzr-1607333005577)(90B1FC32-E0E1-4E63-9EA4-13CB17C714CF.png)]


使用字符指针数组来存储多个字符串数据:

这是一个一维数组,每一个元素的类型是char指针:
char* names[4] = {"jack","rose","lily","lilei"};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UWn0iIhv-1607333005579)(340F7321-9F53-49CF-BF9E-BA8F9B3893E3.png)]

  • 30
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值