C++ string、char *、char[]、const char*
C++ string、char 、char[]、const char
C++ 字符串与字符数组
ref :(2条消息)C++ 字符串与字符数组 详解 - ZeroZone零域的博客 - CSDN博客
在C++中,有两种类型的字符串表示形式:
- C-风格字符串
- C++引入的string类
C-风格字符串
C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。
下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
其实,您不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 ‘\0’ 放在字符串的末尾。所以也可以利用下面的形式进行初始化
char greeting[] = "Hello";
C++ 中的 String 类
C++中的字符串一般有以下四种类型
- string
- char*
- const char*
- char[]
string
string是一个C++类库中的一个类,它位于名称空间std中,因此必须使用using编译指令或者std::string来引用它,它较char*的优势是内容可以动态拓展,比如用+号进行字符串的连接是最常用的操作
char*
char* 是指向字符串的指针,你可以让它指向一串常量字符串。
const char*
指针指向的是一个const char类型,即不能通过当前的指针对字符串的内容作出修改。注意区别
- char * const [指向字符的静态指针]
- const char * [指向静态字符的指针]
char[]
与char*与许多相同点,代表字符数组,可以对应一个字符串,如
char * a="string1";
char b[]="string2";
这里a是一个指向char变量的指针,b则是一个char数组(字符数组)。
区别如下:
-
char*是变量,值可以改变, char[]是常量,值不能改变!
char型数组的名字,也是该数组首元素的地址,是常量 -
char * 和char[]的初始化操作有着根本区别:
测试代码:char *a="Hello World"; char b[]="Hello World"; printf("%s, %d\n","Hello World", "Hello World"); printf("%s, %d %d\n", a, a, &a); printf("%s, %d %d\n", b, b, &b);
结果:
Hello World,13457308 Hello World,13457308 2030316 Hello World,2030316 2030316
char * a=”string1”;是实现了3个操作:
- 声明一个char*变量(栈区)(也就是声明了一个指向char的指针变量);
- 在内存中的文字常量区中开辟了一个空间存储字符串常量”string1”
- 返回这个区域的地址,作为值,赋给这个字符指针变量a
char b[]=”string2”;则是实现了2个操作:
- 声明一个char 的数组
- 为该数组“赋值”,即将”string2”的每一个字符分别赋值给数组的每一个元素
最终的结果:“数组的值”(注意不是b的值)等于”string2”,而不是b指向一个字符串常量
实际上, char * a=”string1”; 的写法是不规范的!
因为a指向了即字符常量,一旦strcpy(a,”string2”)就糟糕了,试图向只读的内存区域写入,程序会崩溃的!
应当按照”类型相同赋值”的原则来写代码:
const char * a="string1";
const char* 与 char[]的区别:
const char * a=”string1”
char b[]=”string2”;
二者的区别在于:
a是const char 类型, b是char const类型 。
( 或者理解为 (const char)xx 和 char (const xx) )
作为函数的声明的参数的时候,char []是被当做char *来处理的!两种形参声明写法完全等效!
另外作为函数的形式参数,两种写法完全等效的!都是指针变量!
string char* char[] const char* 转化概览
总结方法:
- 变成string,直接赋值。
- char[]变成别的,直接赋值。
- char*变constchar*容易,const char*变char*麻烦。
<const_cast><char*>(constchar*);
- string变char*要通过const char*中转。
- 变成char[]。string逐个赋值,char* const char* strncpy_s()。
代码示例
1、string转为其他类型
①、string转const char*
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
std::string str = "HelloWorld!"; //初始化string类型,并具体赋值
const char* constc = nullptr; //初始化const char*类型,并赋值为空
constc= str.c_str(); //string类型转const char*类型
printf_s("%s\n", str.c_str()); //打印string类型数据 .c_str()
printf_s("%s\n", constc); //打印const char*类型数据
return 0;
}
②、string转char*
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
std::string str = "HelloWorld!"; //初始化string类型,并具体赋值
char* c = nullptr; //初始化char*类型,并赋值为空
const char* constc = nullptr; //初始化const char*类型,并赋值为空
constc= str.c_str(); //string类型转const char*类型
c= const_cast<char*>(constc); //const char*类型转char*类型
printf_s("%s\n", str.c_str()); //打印string类型数据 .c_str()
printf_s("%s\n",c); //打印char*类型数据
return 0;
}
③、string转char[]
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
std::string str = "HelloWorld!"; //初始化string类型,并具体赋值
char arrc[20] = {0}; //初始化char[]类型,并赋值为空
for (int i = 0; i < str.length(); i++) //string类型转char[]类型
{
arrc[i]=str[i];
}
printf_s("%s\n", str.c_str()); //打印string类型数据 .c_str()
printf_s("%s\n", arrc); //打印char[]类型数据
return 0;
}
2、const char*转为其他类型
①const char*转string
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
const char* constc = "Hello World!"; //初始化const char* 类型,并具体赋值
std::string str; //初始化string类型
str= constc; //const char*类型转string类型
printf_s("%s\n", constc); //打印const char* 类型数据
printf_s("%s\n", str.c_str()); //打印string类型数据
return 0;
}
②const char*转char*
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
const char* constc = "Hello World!"; //初始化const char* 类型,并具体赋值
char* c = nullptr; //初始化char*类型
c= const_cast<char*>(constc); //const char*类型转char*类型
printf_s("%s\n", constc); //打印const char* 类型数据
printf_s("%s\n", c); //打印char*类型数据
return 0;
}
③const char*转char[]
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
const char* constc = "Hello World!"; //初始化const char* 类型,并具体赋值
char arrc[20] = { 0 }; //初始化char[]类型,并赋值为空
strncpy_s(arrc,constc,20); //const char*类型转char[]类型
printf_s("%s\n", constc); //打印const char* 类型数据
printf_s("%s\n", arrc); //打印char[]类型数据
return 0;
}
3、char*转为其他类型
①char*转string
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
char* c = "HelloWorld!"; //初始化char* 类型,并具体赋值
std::string str; //初始化string类型
str= c; //char*类型转string类型
printf_s("%s\n", c); //打印char* 类型数据
printf_s("%s\n", str.c_str()); //打印string类型数据
return 0;
}
②char*转const char*
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
char* c = "HelloWorld!"; //初始化char* 类型,并具体赋值
const char* constc = nullptr; //初始化const char* 类型,并具体赋值
constc= c; //char*类型转const char* 类型
printf_s("%s\n", c); //打印char* 类型数据
printf_s("%s\n", constc); //打印const char* 类型数据
return 0;
}
③char*转char[]
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
char* c = "HelloWorld!"; //初始化char* 类型,并具体赋值
char arrc[20] = { 0 }; //初始化char[] 类型,并具体赋值
strncpy_s(arrc,c,20); //char*类型转char[] 类型
printf_s("%s\n", c); //打印char* 类型数据
printf_s("%s\n", arrc); //打印char[]类型数据
return 0;
}
4、char[]转为其他类型
#include "stdafx.h"
#include <iostream>
int _tmain(intargc, _TCHAR* argv[])
{
char arrc[20] = "HelloWorld!";//初始化char[] 类型并具体赋值
std::string str; //初始化string
const char* constc = nullptr; //初始化const char*
char*c = nullptr; //初始化char*
str= arrc; //char[]类型转string类型
constc= arrc; //char[]类型转const char* 类型
c= arrc; //char[]类型转char*类型
printf_s("%s\n", arrc); //打印char[]类型数据
printf_s("%s\n", str.c_str()); //打印string类型数据
printf_s("%s\n", constc); //打印const char* 类型数据
printf_s("%s\n", c); //打印char*类型数据
return 0;
}