【C语言】字符串

目录

一、什么是字符串

二、字符串常量在内存中的存储

三、字符串常量在内存中的生成过程与返回的地址

四、变量修改字符串


一、什么是字符串

 "hello world"

由双引号引起来的一串字符成为字符串

字符串后有隐藏的字符串结束的标识符'\0'。

注意在在内存中也会多开辟一个字节存放'\0'!🙃

可用"strlen"来求字符串的长度。

char arr[] = "Hello World";
int st = strlen("Hello Worle");
  • 得到结果为:11
  • strlen()函数是计算字符串长度的,遇到字符串结束标识符就停止计算。返回结果不包含'\0'
  • 因为"Hello World"是常量字符串,所以不需要进行声明定义!

注:"=="不能用来比较两个字符串是否相等,应该使用一个库函数 ---- strcmp(字符串1,字符串2)字符串1和字符串2是两个需要比较的字符串


二、字符串常量在内存中的存储

先说结论:字符串常量只要调用一次就会在常量池中创建,他的生命周期和程序的生命周期一样长。在工程中不管哪个阶段,只要是使用到已经在常量池中创建过相同的字符串常量,就会返回常量池中已经开辟的字符串常量的地址,即已经创建过的字符串常量就不会二次创建!🤯🤯

在这里插入图片描述

我们创建一个相同的字符串常量,用不同的数组来调用打印数组的内存

#include <stdio.h>

int main() {
	char arr1[] = "Hello World";
	char arr2[] = "Hello World";

	printf("数组的第一个字节内容:arr1[0] = %c arr2[0] = %c\n", arr1[0], arr2[0]);
	printf("数组的第一个字节地址:arr1[0] = %p arr2[0] = %p\n", arr1[0], arr2[0]);
	printf("数组的地址:arr1 = %p arr2 = %p\n", arr1, arr2);
	return 0;
}

得到的结果是:(手动对其)

数组的第一个字节内容:arr1[0] = H                              arr2[0] = H
数组的第一个字节地址:arr1[0] = 0000000000000048 arr2[0] = 0000000000000048
数组的地址:                 arr1[0] = 0000007C2C56F688 arr2[0] = 0000007C2C56F6B8

在上图我们也可以看出我们虽然在不同的数组中调用字符串常量,但是我们还是得到相同地址的字符串常量,这就可以说明不才上面说的结论是正确的。


三、字符串常量在内存中的生成过程与返回的地址

不才用视频演示:(当然,不才画的内存图是草图。想要了解详细C语言的内存分布的话,请各位看官自行搜查)

字符串常量在内存中的生成过程

从视频上我们可以了解到,字符串常量返回的首元素的地址,而且字符串常量在常量池中是一个连续的字节空间


四、变量修改字符串

若我们需要更改字符串常量,也不会把字符串常量删除,只是修改变量存储的地址

#include <stdio.h>

int main() {
	char* a1 = "Hello World\0";
	char* a2 = "abc";
	a1 = "abc";
	printf("%s\n", a1);
	return 0;
}
  • 结果为:abc
  • 因为字符串常量返回的是首元素的地址,所以我们也可以用指针来接收


以上就是本章所有内容。若有勘误请私信不才。万分感激💖💖

ps:表情包来自网络,侵删🌹

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值