字符、字符串、字符数组、字符串指针变量

本文详细介绍了C++中的字符和字符串的区别,包括字符、字符串、字符数组和字符串指针变量。讨论了C-风格字符串与C++中的String类,以及4种字符串类型:string、char*、const char*和char[]。重点讲解了它们之间的存储方式、访问方式、定义方法、改变值的方法、占用存储空间和内存可读写性。同时,文章还探讨了const char*与char[]的区别,以及字符串类型之间的转换。最后,讲解了初始化{0}的含义,sizeof与strlen的区别与联系。
摘要由CSDN通过智能技术生成

字符和字符串的区别

字符

如下,定义char,每一个字符一般情况下占用8个字节。

char c, ch;

字符串

例如"helloworld";

注意' '" "的区别,后者为常量字符串

在C++中,有两种类型的字符串表示形式:

  • C-风格字符串
  • C++引入的string类

C-风格字符串

C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用null字符'\0'终止的一维字符数组。因此,一个以null结尾的字符串,包含了组成字符串的字符。

null字符对应的ASCII为0。

下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

其实,您不需要把null字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把'\0'放在字符串的末尾。所以也可以利用下面的形式进行初始化

char greeting[] = "Hello";

以下是 C/C++ 中定义的字符串的内存表示:

C++ 中有大量的函数用来操作以null结尾的字符串:

序号 函数 功能
1 strcpy(s1,s2) 复制字符串 s2 到字符串 s1
2 strcat(s1,s2) 连接字符串 s2 到字符串 s1 的末尾
3 strlen(s1) 返回字符串 s1 的长度
4 strcmp(s1,s2) 返回s1与s2的比较结果
5 strchr(s1,ch) 返回一个指针,指向字符串s1中字符ch的第一次出现的位置
6 strstr(s1,s2) 返回一个指针,指向字符串s1中s2的第一次出现的位置

C++ 中的 String 类

C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。比如:

  • append() – 在字符串的末尾添加字符
  • find() – 在字符串中查找字符串
  • insert() – 插入字符
  • length() – 返回字符串的长度
  • replace() – 替换字符串
  • substr() – 返回某个子字符串

4种字符串类型

C++中的字符串一般有以下四种类型,

  • string
  • char*
  • const char*
  • char[]

下面分别做简单介绍,并说明其中的一些区别

string

string是一个C++类库中的一个类,它位于名称空间std中,因此必须使用using编译指令或者std::string来引用它。它包含了对字符串的各种常用操作,它较char*的优势是内容可以动态拓展,以及对字符串操作的方便快捷,用+号进行字符串的连接是最常用的操作。

关于string的更多性质可以参考下面关于char *的讨论。

char*

char*指向字符串的指针(其实严格来说,它是指向字符串的首个字母),你可以让它指向一串常量字符串。

const char*const char *

该声明指出,指针指向的是一个const char类型,即不能通过当前的指针对字符串的内容作出修改

注意这里有两个概念:

  • char * const [指向字符的静态指针]
  • const char * [指向静态字符的指针]

前者const修饰的是指针,代表不能改变指针
后者const修饰的是char,代表字符不能改变,但是指针可以变,也就是说该指针可以指针其他的const char。

char[]

char*与许多相同点,代表字符数组,可以对应一个字符串,如

char * a="string1";
char b[]="string2";

这里a是一个指向char变量的指针,b则是一个char数组(字符数组)

字符数组(char [])和字符串指针变量(char *)的区别

以下几个表达是等价的

#include <stdio.h>

int main ()
{
   char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
   printf("Greeting message: %s\n", greeting );

   char greeting1[6] = "Hello"; //must over 5
   //greeting2[1] = '1';
   printf("Greeting1 message: %s\n", greeting1 );

   char greeting2[] = "Hello";
   printf("Greeting2 message: %s\n", greeting2 );

   char *greeting3 = "Hello"; // can't change
   printf("Greeting3 message: %s\n", greeting3 );

   return 0;
}

又例如如下代码:

#include<iostream>
using namespace std;
int main()
{
    char *p1 = "abcd";
    char p2[] = "1234";
    return 0;
}

这二者的区别还在于:

存储方式

p1是一个指针变量,有一块内存存储它,它的内容是字符串的地址,而**字符串本身是存放在以该首地址为首的一块连续的内存空间中并以'\0'作为串的结束。**那么我们要访问字符串就先要取出p1中存储的地址,然后计算偏移量,进行访问;而p2是字符数组,是由于若干个数组元素组成的,它可用来存放整个字符串。

访问方式

不同于p1,p2直接

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值