文章目录
前言
学习C++时,一度被各种类型的字符折磨的头皮发麻,如字符数组,字符指针,C风格字符串,字符数组指针,字符指针数组,字符串常量等等等等;
经过一番学习,于下文写出关于C++ char类型的一点点学习心得;学识浅薄,如有错漏,请不吝赐教;
一、基本概念
0. 楔子
这里都是基础中的基础,理解这个便知道字符各种类型万变不离其宗(本质上就是const 修饰符,指针以及数组类型搞的鬼)。当然,如果直接从第二章看起也是没有问题的,看完第二章再回过头浏览一下或许对下述概念就会清晰不少;
1. char 是什么?
char 是 C++的一个基本数据类型,中文一般称为字符,内存占用1字节,取值范围为-128~127;
最基本的声明并初始化一个char类型:
char c = 'a';
C++中的字符串一般指是 string 类型,不属于基本数据类型,是C++标准库中的string类,在此不进行介绍;
2. 数组
对于类型T,T[size] 就是 “具有 size 个 T 类型的元素的数组” 类型;这些元素的下标从0到 size - 1;
在C++中,指针和数组密切相关。一个数组的名字能够被用作到他的开始元素的指针,例如:
int v[] = {
1,2,3,4};
int* p1 = v; // 指向开始元素(隐式转换)
int* p2 = &v[0] // 指向开始元素
int* p3 = &v[4] // 指向最后元素之后一个位置
3. 指针
对类型T, T* 是 ”到T的指针“ 类型,也就是说,一个类型为 T* 的变量能保存一个类型 T 的对象的地址;
例如:
char c = 'a'
char* p = &c; // p 保存着 c 的地址
4. 常量
const 修饰符就是为了直接表述 “不变化的值” 这样一个概念;
关键字 const 可以加到一个对象的声明上,将这个对象声明为一个常量。因为常量不允许赋值,因此必须初始化;例如:
const int model = 90; // model 是常量
const int v[] = {
1, 2, 3, 4} // v[i]是常量
const int x; // 错误:没有初始化
二、字符各种类型
1. 字符串文字量;C风格字符串;常量字符数组
这仨其实是一个东西;
字符串文字量即用双引号括起的字符序列,也常叫做 字符串,不过此处为了和字符串类型 string 做区分,采用字符串文字量命名;
"这是一个字符串文字量";
所谓的C风格字符串,也即是上述的字符串文字量,它包含的字符个数比它看起来的字符数多一个,总是由一个空字符’\0’结束。
sizeof("abc") == 4
字符串文字量与C风格字符串的类型为"适当个数的常量字符的数组",即 常量字符数组 ,即 const char[];
需要注意的是,可以用字符串文字量给一个 const char* (常量字符指针) || char* (字符指针) 赋值;在 C 和 C++ 的定义中,字符串文字量的类型就是 char*;
ps: 为什么不是 const char*? 别问我,我也不知道,书上就是这么写的 qaq;
不过可以这么理解,const char* 本质上也是 char*;
这里采用书上的说法;后续也使用 char*;
2. 字符数组;
常量字符数组本质上也是字符数组的一种,只是多了 const 修饰符修饰而已;
不过需要注意的是关于字符数组 char[] 与 常量字符数组 const char[] 的初始化;
const