C,C++中初始化字符串,char,char*,char[],new,常量字符串之间的区别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

欢迎补充

一、c语言下的字符串

  • c语言中,没有专门的字符串类型,只能使用数组或者指针来间接的存储字符串。
  • C语言中操作字符串是通过操控连续内存空间中的存储单元的首地址进行的,正如以下示例:str1是字符串"12345"的首地址,str2指针变量指向的也是"12345”的首地址。
//数组方式
char str1[] = "12345";
//指针方式
char* str2 = (char*)"12345";
const char* str2 = "12345";

注意: "12345"是const char类型,上述指针方式只是把str2指针的指向强行允许指向该字符串,"12345"占用的内存的数据类型仍然是const char类型且不允许修改。例如sttr2[1] = ‘1’会报错。
如果想要可以修改,可以另外开辟一片内存,存储数据位char类型,利用mecpcy函数把"12345"的内存赋值进新创建的允许修改的内存!哈哈,char操控内存就是麻烦,不如string一根。

-字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元,无论在哪个字符集中,字符编号都是一个整数。从这个角度看,字符类型和整数类型本质上没什么区别。我们也可以给字符类型赋值一个整数,或者以整数形式输出字符类型, char b = 70; //输出的是E,

char* cha = (char*) new char[10] { "123456" };//是字符哈
char* cha =(char*) new char[10]{'1','2','3','4' };//也是字符
char* cha = (char*) new char[10] { 56,2,3,4 };//是ASCII码值!!!!输出到终端输出的是翻译后的字符!!!

二、C语言使用字符串

先记录一个小bug

在这里插入图片描述
cha = (char*)“123456”;
这行赋值时候cha已经不是指向堆区了,而是指向栈区
最后delete[]cha;肯定是要报错了!

char *使用字符串 使用new分配地址

在C++中,双引号内的字符序列会被视为一个以空字符结尾的字符串。这意味着 "Hello" 实际上是一个包含字符 H, e, l, l, o, \0 的字符数组。所以在new时候至少要分配6字节内存。

char* cha = new char[6] {"Hello"};	
cout << strlen(cha) << endl;
for (int i{ 0 }; i < strlen(cha); i++)
{
	cout << cha[i] << endl;
}
delete[] cha;

char *使用字符串 使用malloc、calloc动态分配分配地址

char* cha = (char*)malloc(7) ;//这种情况下没办法直接使用{}赋值,好像只能用下面方式,比较麻烦
cha[0] = '1';
cha[2] = '1';
cha[3] = '1';
//如果采用以下方式,cha指向的就是栈区内存了,不用free内存
cha = (char*)"123456";
cout << strlen(cha) << endl;
for (int i{ 0 }; i < strlen(cha); i++)
{
	cout << cha[i] << endl;
}
//free(cha);

char *使用字符串 在栈区分配地址

	char* str3 = (char*)"hello";//常量--const--所以强制类型转换    双方类型
    const char* str6 = "hello";//常量--const-- 想

在C语言中字符串常量的本质表示其实是一个地址,“hello就是一个无类型的地址”,编译器会给字符串常量分配地址,
即字符串常量的本质表现是代表它的第一个字符的地址。如下:
在这里插入图片描述

char [ ]数组方式使用字符串

	char str[0xFF] = { 0x48,'e','l','l','o','\0' };//str[5]以及后面的全都是\0  每个字符所占内存1字节  连续
    cout << str << endl;//hello,
    
	 //“"用双引号表示字符串
    char str2[0xff] = { "hello" };//当编译器遇到这句时,会把str2数组中从第一个元素把hello\0 逐个填入

char*和char[]的区别

C语言中数组名可以赋值给指针表示地址, 但是指针却不能赋给给数组名,数组名是一个常量类型,所以不能修改。。所以下面的s=a; 但是不能a=s;
char *s;
char a[ ] ;

wchar_t来存储中文字符

char和wchar_t具体存储中文的原理请看这篇链接

三、c++存储字符串

就使用string就完事,好用!

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值