博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ string、char *、char[]、const char*
阅读量:5320 次
发布时间:2019-06-14

本文共 6750 字,大约阅读时间需要 22 分钟。

目录

C++ string、char 、char[]、const char

C++ 字符串与字符数组

ref :

在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个操作:

  1. 声明一个char*变量(栈区)(也就是声明了一个指向char的指针变量);
  2. 在内存中的文字常量区中开辟了一个空间存储字符串常量”string1”
  3. 返回这个区域的地址,作为值,赋给这个字符指针变量a

char b[]=”string2”;则是实现了2个操作:

  1. 声明一个char 的数组
  2. 为该数组“赋值”,即将”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* 转化概览

转换

总结方法:

  1. 变成string,直接赋值。
  2. char[]变成别的,直接赋值。
  3. char*变constchar*容易,const char*变char*麻烦。<const_cast><char*>(constchar*);
  4. string变char*要通过const char*中转。
  5. 变成char[]。string逐个赋值,char* const char* strncpy_s()。

代码示例

1、string转为其他类型

①、string转const char*

#include "stdafx.h"#include 
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 
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
(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 
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 
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 
int _tmain(intargc, _TCHAR* argv[]){ const char* constc = "Hello World!"; //初始化const char* 类型,并具体赋值 char* c = nullptr; //初始化char*类型 c= const_cast
(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 
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 
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 
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 
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 
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;}

转载于:https://www.cnblogs.com/zwk-coder/articles/10988504.html

你可能感兴趣的文章
CentOS 6.5(x86_32)下安装Oracle 10g R2
查看>>
C语言学习总结(三) 复杂类型
查看>>
数据类型转换
查看>>
HNOI2018
查看>>
Android中检测网络连接状况的方法
查看>>
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
python3基础知识自学笔记3-集合字典元组
查看>>
session的属性/方法/事件
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
思维导图 第六章 项目进度管理
查看>>
[Tex学习笔记]尝试数学公式
查看>>
省市县,循环组装,整合大数组
查看>>
C语言中返回字符串函数的四种实现方法
查看>>
Jmeter学习及使用(一)安装
查看>>
H5 调用手机摄像机、相册功能
查看>>
Google Closure Compiler 高级模式及更多思考(转)
查看>>
python--闭包函数、装饰器
查看>>
【坑】linux目录软连接的相关操作--很容易误操作
查看>>