*数组是一种数据格式,能够存储多个同类型的值。每个值都存储在一个独立的数组元素中,计算机在内存中一次存储数组的各个元素(连续存储)。
*创建数组的声明语句应指出以下三点:
- 存储在每个元素中的值的类型
- 数组名
- 数组中的元素数
*声明数组的通用格式 typeName arrayName[arraySize] ,其中arraySize必须是整型常数或const值,也可是常量表达式。即其中所有的值在编译时都是已知的,不能是变量。
*编译器不会检查使用的数组下标是否有效。
*如果将sizeof操作符用于数组名,得到的将是整个数组中的字节数。但如果将sizeof用于数组元素,则得到的将是元素的长度(单位为字节)。
eg. int array[10]; 则有 sizeof(array) == 40 , sizeof(array[0]) == 4
且有 sizeof(array)/sizeof(array[0]) == arraySize == 10
*只有在定义数组时才能使用初始化,此后就不能使用,也不能将一个数组赋给另一个数组:
int cards[4] = {3,6,8,10}; // okay
int hard[4]; // okay
hand[4] = {5,6,7,9} // not allowed
hand = cards; // not allowed
*如果只对数组的一部分进行初始化,则编译器将其他元素设置为0
*如果初始化数组时方括号内为空,C++编译器将计算元素个数。
eg. short totals[] = {1,5,3,8}; 编译器将使totals数组包含4个元素。
=============================================================
*字符串是存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种。第一种来自C语言,常被成为C-风格字符串。另一种介于string类库。
*存储在连续字节中的一些列字符以为着可以将字符串存储在char数组中,其中每个字符都位于自己的数组元素中。
*C-风格字符串以空字符(null character)结尾,空字符被写作\0,其ASCII码为0,用来标记字符串的结尾。
eg. char dog[5] = {'b','e','a','u','x'}; // not a string!
char cat[5] = {'f','a','t','s','\0'}; // a string!
这两个都是char数组,但只有第二个是字符串。空字符串对C-风格字符串而言至关重要。
*将字符数组初始化为字符串的方法:使用一个双引号括起字符串即可。这种字符串被称作字符串常量(string constant)或字符串字面值(string literal)。
*用引号括起的字符串隐式地包括结尾的空字符。
*在确定存储字符串所需的最短数组时,别忘了将结尾的空字符计算在内。
*字符串常量(使用双引号)不能与字符常量(使用单引号)互换。
*任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个。
eg. char a[] = "abcdefg" "hijk";
char b[] = "abcdefghijk";
a与b的数组元素完全一样。
*sizeof操作符指出整个数组的长度,strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度(数组本身的长度在声明时决定,大于或等于数组中字符串的长度)。另外,strlen()函数只计算可见的字符,而不把空字符计算在内。
*cin使用空白(空格、制表符和换行符)来定字符串的界。
=============================================================
*string类使用起来比char数组简单,同时提供了将字符串作为一种数据类型的表示方法。
*在很多方面,使用string对象的方式与使用字符数组相同:
- 可以使用C-风格字符串来初始化string对象。
- 可以使用cin来将键盘输入存储到string对象中。
- 可以使用cout来显示string对象。
- 可以使用数组表示法来访问存储在string对象中的字符。
*string对象和字符数组之间的主要区别是,可以将string对象声明为简单变量,而不是数组。
*string类具有自动调整大小的功能。
=============================================================
*结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据,从而将数据的表示合并到一起。
*结构师用户定义的类型,而结构声明定义了这种类型的数据属性。定义了类型后,便可以创建这种类型的变量。
*代码中使用分号来结束结构的声明。
*C++允许在声明结构变量时省略关键字struct:
eg. struct inflatable goose;
inflatalbe vincent;
*可以使用成员操作符(.)来访问各个成员。
*结构的初始化 详见书P85
*结构数组:数组的元素为结构体的对象
inflatable guests[2] =
{
{"Bambi", 0.5, 21.99},
{"Godzilla", 2000, 565.99}
};
=============================================================
*C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。还允许定义新类型。
eg. enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
- spectrum被称为枚举(enumeration)。
- 将red,orange等作为符号常量,对应整数0~7.这些常量被叫作枚举量(enumerator)。可以通过显式地指定整数值来覆盖默认值。
*在不进行强制类型转换的情况下,只能将定义枚举时使用的枚举量赋给这种枚举的变量。
*枚举量是整型,可悲提升为int类型,但是int类型不能自动转换为枚举类型。
eg. int color = blue; // valid, color == 4
band = 3 // not valid
color = red + 3 // valid, color == 3
*如果int值是有效的,则可以通过强制类型转换,将它赋给枚举变量
eg. band = spectrum(3);
*如果试图对一个不适当的值进行强制类型转换,结果是不确定的,这意味着不会出错,但得到的结果不可依赖。
*设置枚举量的值
- 可以使用赋值操作符来显示地设置枚举变量的值: enum bits{one = 1, two = 2, four = 4, eight = 8};指定的值必须是整数。
- 可以只显式地定义其中一些枚举变量的值: enum bigstep{first, second = 100, third} 后面没有被初始化的枚举量的值将比其前面的枚举量大1,故third的值为101
- 可以创建多个值相同的枚举量: enum {zero, null = 0, one, numero_uno = 1};
*枚举的取值范围
- 上限:找到枚举值的最大值,然后找出大于这个最大值的、最小的2的幂,将它减去1,即为上限。
- 下限:找到枚举值的最小值,如果不小于0,则取值范围下限为0,否则采用与寻找上限方式相同的方式,但加上负号。
- 一个整数不是枚举值,但处在枚举定义的取值范围内,则代码是合法的。运行结果则难以预料。