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

  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 <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;
}
posted @ 2019-06-07 16:31  不燥不怕  阅读(1828)  评论(0编辑  收藏  举报