C++中的复合类型主要有三种:数组,指针,和结构。
数组的索引是从0开始的,所以months[0]是指的数组months的第一个元素。最后一个元素的索引比数组的长度小1。
初始化数组的时候,提供的值可以少于数组的元素数目。如果只对数组的一部分进行初始化,则编译器把其他元素设置为0。
sizeof运算符指出整个数组的的长度。而strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度。strlen()只计算可见的字符,并不把空字符计算在内。
getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。例如,假设要使用getline() 将姓名读入到一个包含20个元素的name数组中,可以使用这样的调用:cin.getline(name, 20);。
要使用string类,必须在程序中包含头文件string。string类位于名称空间std中,因为必须using namespace std或者std::string。
string对象可以用+将两个字符串合并起来。
结构是一种比数组更加灵活的数据格式,因为同一个结构可以存储多种类型的数据。首先,定义结构描述,它描述并标记了能够存储在结构中的各种数据类型。然后,按照描述创建结构变量。比如:
struct inflatable
{
char name[20];
float volume;
double price;
}
关键字struct表明这是一个结构,inflatable是结构的名称。大括号中存储的是结构存储的数据类型的列表,其中每个列表项都是一条生命语句,每一项都被称为结构成员。
在默认情况下,将整数值赋给枚举量。第一个枚举的值为0,第二个为1,以此类推。
可以使用赋值运算显式的设置枚举量的值:enum bits{one=1, two=2, four=4, eight=8}。指定的值必须是整数。又比如: enum bigstep{first, second=100, third}。这里,first默认为0,后面没有被初始化的枚举量的值将比其前面的枚举量大1,因此third的值为101。
指针是一个变量,其存储的是值的地址,而不是值本身。
在找寻常规变量的地址时,只需要对变量应用地址寻址符&,就可以获得它的位置。如果home是一个变量,&home就是它的地址。
*称为间接值或解除引用运算符,将其应用于指针,可以获得该地址处所存储的值。例如,manly是一个指针,则manly表示的是一个地址,而*manly表示的是存储在该地址处的值。*manly与常规int变量等效。
对每个指针命名,都必须使用一个*。例如:int * p1,p2.这里p1是指针,而p2是一个int的变量。所以应该这样命名:int*p1,*p2.
在声明语句中初始化指针。在这种情况下,初始化的是指针,而不是它指向的值。比如:int higgens=5; int * p1=&higgens; 这个例子里面是将&higgens的值给了p1,而不是*p1.
在C++中,创建动态数组很容易,只要将数组的元素类型和元素数目告诉new即可。必须在类型后面加上【】,其中包含元素的数目。例如,要创建一个包含10个int元素的数组,可以这样做:int* psome=new int[10]; new运算符返回第一个元素的地址,该地址被赋给指针psome。
为数组分配内存的通用格式如下: typename* pointername=new typename[n]。
如果给cout提供一个指针,它将打印指针的地址。但是如果指针的类型是char*,则cout将打印指针指向的字符串。