近几天,感觉没什么事作,又重新看了 C++ Programming Language (以前也没怎么认真看)这本 C++ 经典教程。但在第一部份就遇到了许多问题,以前根本就不太清楚。特别是 char 型指针的运用,不清它与 char 型数组,string 型数据的关系与区别。
通过几天的学习,感觉已理解了部份,分析了写几种数据类,下面将具体说一说,希望大家提出建议。指出错误!
一. 假如现要存储数据 “abc”。
分为两种方式:有带0结束标志的,无带0结束标志的。
1. 有结束标志的定义方法。
Char* ch = “abc”; // strlen(ch) = 3; size = 4;(结束标志)
Char ch[] = “abc”; // strlen(ch) = 3; sizeof(ch) /sizeof(char) = 4;
其它还可以以显示的方法加0结束标志。
这两种方式相似,均以0标志字符串结束。所以它们都能用C里的一系列字符串处理函数,如:strcmp(); strcpy()[注意:传递的第一个参数不能是第一种数据类型]; strlen() 等。但它们的实际类型有很大区别。第一种的实际类型为 const char* ,所以不能用下标操作修改某个元素的值,这就说明了strcpy()的运用,但可以整体修改(ch = “aaaa”),因为指针不是常量,它只是一个指向常量的指针(此问题见const 运用)。而第二种是一个字符数组[注意与 char ch[] = { ‘a’, ‘b’, ‘c’ } 的区别]。
2. 无结束标志的定义方法。
Char ch[] = { ‘a’, ‘b’, ‘c’ }; //sizeof(ch)/sizeof(char) = 3;
//strlen(ch) = ? 错误方法,无0结束符。除非为:char ch[] = {‘a’,’b’,’c’,0}
Char* ch = new char[3]; ch[0] = ‘a’; ch[1] = ‘b’; ch[2] = ‘c’; //strlen(ch) = ? // size = 3;
String ch = “abc”; // C++ 提供的 string 类。 //ch.size() = 3;
在这几种方法中,C里的一系列字符串处理函数就没用了,因为它们要以有0结束符为前提条件。但在使用时可以人为的增加结束符,数组空间增加一个,并在最后一个值改为0来达到结束的条件,但这样用很不是方便。String 类型可以调用相应的函数转化为C类型的字符串(ch.c_str())。String 类提供的一系列成员方法明显比 C 类型字符串处理更好,且不易出错。
3. 运用以上的方法可以分析一下面这个定义具体细节。
Char* ch[] = { ‘b’, ‘c’, ‘d’ };
Char* ch[] = { “bbb”, “aaa”, “ccc” };
(1).是否在确。
(2).sizeof(ch); sizeof(ch[1]); strlen(ch); strlen(ch[1]);
(3).ch[1] = “fff”; ch[1][0] = ‘f’; 是否可行。
(4).假如要复制此内容到另一个存储空间,怎样完成。
解:(1). 第一个错误,第二个正确。因为第一个是一个数组,且成员为指向字符串的指针,而初始化的数据为字符,可以改为:char* ch[] = { “b”, “c”, “d” }; 下面的题以第二个正确的为前提。
(2).sizeof(ch) = 12; sizeof(ch)/sizeof(char*) = 3;
sizeof(ch[1]) = 4; //指针的长度
strlen(ch) = ?; //数组无0结束标志。可以多加一个:char* ch[] = {“bbb”, “aaa”,”ccc”,0};
strlen(ch[1]) = 3; //单个数据为 char* 型,有0结束符,可以计算。
(3).ch[1] = “fff”; 正确,因为它不是常量指针,只是指向常量的指针。
ch[1][0] = ‘f’; 错误,修改常量。
(4). int size = sizeof(ch)/sizeof(char*);
char** chh = new char*[size];
for(int i = 0; i < size; ++i)
{
char* c = new char[strlen(ch[i]) + 1];
strcpy(c, ch[i]);
chh[i] = c;
}