c++(02) char定义字符串和string定义字符串有什么不同?

char数组可以用于声明字符串,也就是C-style字符串。在C++中,可以使用char数组来存储以null结尾的字符序列,从而表示字符串。这种表示方法被称为C-style字符串,或者以null结尾的字符串。

如,可以使用以下方式声明和初始化一个以char数组表示的字符串:

char str[] = "Hello";

在这种情况下,str是一个字符数组,长度为6(包括结尾的null字符\0),用于存储字符串"Hello"。可以通过索引访问char数组中的特定字符,并使用C-style字符串函数对其进行操作。

然而,与std::string相比,使用char数组声明字符串存在一些限制和不便之处。例如,char数组的长度是固定的,一旦声明后,无法动态更改。如果需要在运行时动态调整字符串的长度,需要手动进行内存管理。此外,对于C-style字符串,需要使用C-style字符串函数来进行字符串操作,而不像std::string那样提供了更多的成员函数和操作符。

string str = "Hello";

在C++中,如果需要更方便、安全和灵活地处理字符串,通常建议使用std::string类,除非特定的需求或限制需要使用char数组来表示字符串。

字节分配

 在字节上,std::string和char数组在内存布局和存储方式上有一些不同。

std::string

std::string是一个类对象,它在内部使用动态分配的内存来存储字符串。通常,std::string对象包含一个指向堆上分配的字符数组的指针,以及用于跟踪字符串长度的其他数据成员。这意味着std::string对象的大小(占用的字节数)通常比字符串本身的长度大,因为它还需要存储其他元数据。

char数组

 char数组是一个连续的内存块,用于存储字符序列。C-style字符串以null字符(\0)作为字符串的结束标志。因此,char数组的大小等于字符串的长度加上1(用于存储null字符)。

假如有以下示例:

std::string str = "Hello";
char arr[] = "Hello";

 std::string对象str在内存中的布局可能如下所示:

|-----------------|
|   字符数组指针   |
|-----------------|
|   字符串长度     |
|-----------------|
|   字符串数据     |
|-----------------|

而char数组arr在内存中的布局可能如下所示:

|-----------------|
|   'H'           |
|-----------------|
|   'e'           |
|-----------------|
|   'l'           |
|-----------------|
|   'l'           |
|-----------------|
|   'o'           |
|-----------------|
|   '\0'          |
|-----------------|

std::string对象需要额外的内存来存储字符串的长度和字符数组指针。而char数组只需要存储字符序列本身。

std::string类提供了许多方便的成员函数和操作符,可以更容易地操作和处理字符串。与使用char数组相比,std::string提供了更高级的字符串功能,并且可以自动管理内存。

例子

#include "iostream"
#include "string"

using namespace std;

int main() {
    //C语言风格的字符串
    char string1[] = "abcdefgh";
    cout << "string1(char) = " << string1 << "\tsizeof(string1)=" << sizeof(string1) << endl;
    string string2 = "abcdefgh";
    cout << "string2(string) = " << string2 << "\tsizeof(string2)=" << sizeof(string) << endl;
    //c++风格的字符串
    return 0;
}

 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值