字符:
以下数据类型用于定义字符变量:
char 字符,一般占用1个字节,取值是 0~127,和整型是等价的。
wchar_t 宽字符,占用2个或4个字节,根据系统的差别而不同。
字符变量可用字符常量来赋值,也可以用整数来赋值。
字符常量:用单引号括起来的一个字符,或转义字符,例如:'a' '\n' '\u4E90'。
如果一个字符常量前用L来修饰,表示一个宽字符,它只能用 wchar_t 类型的变量来存储 。例如:L'A'。
字符数组:
字符数组就是以字符为元素的数组,可以这样定义和初始化:
char greeting[5] = {'H','e','l','l','o'};
元素数量可以省略:
char greeting[] = {'H','e','l','l','o'};
字符串:
如果一个字符数组以'\0'结尾,就专门称作”字符串”。以下写法都等价:
char greeting[6] = {'H','e','l','l','o','\0'};
char greeting[] = {'H','e','l','l','o','\0'};
char greeting[] = "Hello";
string:
string 类是一个C++标准库中的类,支持 + = .size() 等操作。用法:
include <string>
string str1 = "hello";
string str2 = "world";
string str3;
str3 = str1+str2;
str3.size();
=====================================================
以上,是C++基本的数据类型。但是对于C++的变量来说,有一个永恒的迷惑:一个变量究竟是指它的地址,还是那个地址存储的内容?
每当定义了一个变量:
char Var = 'a';
那么系统会在某个地址存上一个信息。这个变量是地址和内容的统一体,但对于上面这样定义的变量名 Var,”显然地”代表内容,要获知其地址,就用: &Var。
如果要定义一个变量让它”显然地”代表地址呢?那就这样:
char *pVar;
注意,我们一般难以人工分配一个内存地址,因此也难以对其初始化,但为了防止出现错误,一般要用 null 来初始化:char* pVar = null;
这里非常具有迷惑性:对变量取地址用 &,而定义地址变量却用 *,细想也对:对”显然”为内容的变量取地址用 &,定义”显然”为地址的变量【有一个专门的名词叫”指针”】用 *。
那么:可以如下赋值:
pVar = &Var; // 这里传递的是地址。
对一个地址,取其中的内容,用*,*pVar 就是 'a'。
小结:
1)内容定义: char Var 取地址: &Var
2)地址【指针】定义: char* pVar 贼值: pVar = &Var 取内容: *pVar
写到这里似乎有些天晴了,然而还有一个概念叫”引用”:
char& Var2 = Var;
这个意思是说:声明了一个变量 Var2,并用 Var 的内容显式对其初始化,但是:两者根本就是一个人好吗?引用的一个用处就是作为函数的参数,在执行函数的同时改变其内容。
对比:
char Var3 = Var;
这是新开辟了一块内存,并用 Var 的内容对其初始化。
另:数组名实际上是一个地址,其首元素的地址。所以,还可以这样定义一个数组:
char* greeting = new char[6];
char* greeting = new char[6]{'H','e'}; // 只初始化前两个元素。
char* greeting = "Hello";
=====================================================
CString:
有关字符类型有很多宏定义,(有一些在 winnt.h 里),是为了 ANSI 和 UNICODE 的兼容。
例如:
CHAR == char
WCHAR == wchar_t
而 TCHAR 是一种条件类型,如果定义了 UNICODE,就 == WCHAR,否则 == CHAR。
LPSTR == CHAR*
LPCSTR == const CHAR*
LPTSTR == TCHAR*
LPCTSTR == const TCHAR*
TCHAR* greeting = _T("Hello");
LPTSTR greeting = _T("Hello");
char* => CString
char* p1="Hello";
CString c1 = p1;
CString c2(p1);