本文已参与「新人创作礼」活动,一起开启掘金创作之路。
第四章 复合类型
博客地址
本文记录CCPlus第四章学习
知识整理
c++有三种复合类型:数组,结构和指针。
数组已经很熟悉了,用于存储相同类型的数据列表,通过索引和下标,可以访问各个元素。需要注意的是,c++数组只有在定义的时候才能使用初始化,即int nums[2] = {3, 8},而不能nums[2] = {2, 7},同时不能将一整个数组赋值给另外一个数组。
数组还包括字符串数组,即char数组。需要注意的是,若char数组结果为\0,即空字符,则可表示字符串。对字符串数组输入时,cin只能一次输入一个单词,这时要使用cin.get()与cin.getline()两个函数,要弄清楚两个函数的区别。get()函数遇到换行符时,会取消输入,但会将换行符留在输入序列中,这会造成一些问题,而getline()函数会将换行符从输入序列中剔除。两者使用要看具体情况。
对于字符串,c++还有string对象,可以简化很多对字符串的操作,非常方便使用。
sizeof用于数组名,得到的是整个数组的字节数,而不是单个元素的字节数。
结构同样也是很实用的一种复合类型,再同一个结构中可以存储不同类型的数据,要使用结构,需先定义结构,下面为书中定义结构描述的例子:
struct inflatable{
char name[20];
float volume;
double price;
}
然后就可以使用结构,结构使用时就像基础类型,可以有结构数组,结构赋值等,非常方便,如下
inflatable hat;
inflatable gifts[100];
c++中还有一种共用体类型,与结构类似,可以存储不同的数据类型,但同时只能存储其中的一种。这种结构还是头一次了解到,其声明如下:
union on4all{
int int_val;
long lon_val;
double double_val;
}
one4all pail;
它在某一时刻可以为int类型,在某一时刻可以为double类型,只需要赋值即可,不需要关注它怎么换类型,但它的主要优点是可以节省内存,它的长度为最大成员的长度。
接下来就是枚举类型,这个类型还是听过,用过的,但用的不多,声明如下
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
spectrum band;
里面的red等称为符号常量,在枚举中,它们都对应一个整数值,于是可以直接将符号赋值给枚举变量,在java开发中,枚举主要用来限制变量范围以及便于明确变量业务赋值,因为字符比整型容易辨认。
枚举的枚举值不一定需要存在,但要在枚举定义的取值范围内,范围上限则是大于最大值的2的幂减一,如最大值是101,则上限为127,要计算下限,则看最小值。最小值大于0,下限就为0,若小于0,下限就是小于该负值的2的幂加1。如最小值为-6,则下限为-7。
最后就是指针。指针是c与c++一个非常重要,并且非常难的一个概念。指针表示的不是值,而是一个地址。
int * p_updates;
p_updates为指针名,指向地址。*为解引用符,*p_updates指向该地址内的值。使用指针会遇到很多的危险,一定要在对指针应用接触引用符号之前,将指针初始化一个确定的,适当的地址,不能直接将一个整型赋值给指针。如果要赋值的话,需将正确整型地址通过强制类型转换将数字转换为适当的地址类型。
int * pt;
pt = (int *) 0xB80000000;
指针除了静态分配地址,还可以使用new运算符为其动态分配地址,但要注意使用delete删除内存
int * pn = new int;
delete pn;
new与delete必须配对使用,不能漏删,少删,重复删除,这样会出现意想不到的错误。
使用动态指针还可以创建动态数组
int * psome = new int [10];
delete [] psome
psome是一个指向int的指针,即数组的第一个元素,psome = psome + 1可以吧指针指向第二个元素,指针+1是将指针指向下一个元素的地址,即在psome数组中是地址+4。
c++有三种管理数据内存的方式:自动存储,静态存储和动态存储。
自动存储即在函数内部定义变量使用的自动存储空间,该变量为自动变量。作用域在函数内,随函数消亡而消亡。自动变量存储在栈内。
静态存储是整个程序执行期间都存在的存储方式。有两种声明静态变量的方式:在函数定义,以及使用关键字static
动态存储称为自由存储空间或堆,new与delete运算符相关的变量即为动态变量,它们能够在一个函数中分配内存,在另一个函数中释放,变量的生命不完全受程序或函数的生存时间控制。
复习题
-
如何声明下列数据?
-
actor是由30个char组成的数组。
char actor[30]; -
betsize是由100个short组成的数组
short betsize[100];
-
-
下面的代码是否有效?如果有效,它将打印出什么结果?
cout<<(int *)"Home of the jolly bytes";有效,表达式"Home of the jolly bytes"为字符常量,该语句打印出字符串的地址。
-
声明一个vector对象和一个array对象,都包含10个 string对象。指出所需的头文件,但不使用using。使用const来指定要包含的string对象数。
#include<iostream> #include<string> #include<vector> #include<array> const int strLen = 10; std::vector<str::string> vec(strLen); std::array(std::string, strLen) arr;