C++第四章 复合类型(数组、字符串、结构、共用体、枚举、指针)

4.1数组

数组(array)是一种数据格式,能够存储多个同类型的值。
创建数组:声明存储在数值中的值的类型;数组名;元素数
typeName arrayName[arraySize]
C++数组从0编号,带索引的方括号
数值初始化对不同值用逗号隔开,花括号括起来
将sizeof运算符用于数组名,得到的将是整个数组中的字节数,但如果将sizeof用于数组元素,则得到的是元素的长度。
只有在定义数组时才能使用初始化,以后就不能使用了,也不能将一个数组赋值给另一个数组,但是可以使用下标给数组元素赋值。
初始化数组时,提供的值可以少于数组的元素数目,剩下的数会被赋值为0。
如果初始化数组时方括号为空(未定数组大小),则根据赋值个数计算数组。
在C++11中,数组的初始化可省略等号;可在大括号中不包含任何东西;禁止缩窄转换。

4.2 字符串

字符串是存储在内存的连续字节中的一系列字节。以空字符结尾。也可直接用一个引号括起字符串,用引号括起字符串隐式地包括结尾的空字符。数组长度需要包括空字符。
单引号表示字符常量(不包含空字符),双引号表示字符串常量(包含空字符)。
任何两个有空白(空格、制表符、换行符)分隔的字符串常量都将自动拼接成一个字符串,拼接时不会被连接的字符串之间添加空格,第二个字符串的第一个字符将紧紧跟在第一个字符串的最后一个字符后面。
将字符串存储到数组中——将数组初始化为字符串常量(char name[size]=“”),或者将键盘或文件输入读入到数组中(数组类型也要定义为char)
sizeof()可计算整个数组长度,strlen()计算数组中可见字符串(不包括空字符)长度。
cin使用空白(空格、制表符、换行符)来确定字符串的结束位置,cin在获取字符数组输入时只读取一个单词,若输入两个单词,第二个单词会作为下一个输入。

#include<iostream>
using namespace std;

int main() {
    const int ArSize = 20;
    char name[ArSize];
    char dessert[ArSize];
    cout << "Enter your name:\n";
    cin >> name;
    cout << "Enter your favoraite dessert:\n";
    cin >> dessert;
    cout << "I have some delicious " << dessert;
    cout << " for you, " << name << ".\n";
    return 0;
}
Enter your name:
aa bb
Enter your favoraite dessert:
I have some delicious bb for you, aa.

每次读取一行字符串输入:
面向行的输入:
cin.getline(name,size),它通过回车键输入的换行符来确定输入结尾。size 限制来读取字符个数。
cin.get()会将换行符保留到下一次输入,因此,在读取下一次输入到数组中时需要先通过cin.get()读取下一个字符,可用cin.get(name,size).get()。get()可以保留未读内容,因此,可以知道停止读取是因为读取来整行还是数组已满。

4.3 string类简介

要使用string类,必须包含头文件#include。
string不需要像数组一样定义大小,可以自定处理string的大小。
不能将一个数组赋给另一个数组,但是可以将一个string对象赋给另一个string对象。
可以用+将两个对象合并起来,还可以使用运算符+=将字符串附加到string对象的末尾。
对于string类型的行输入,getline(cin,string)

**原始字符串:*字符表示的就是自己,如“\n”表示的也是自己而不是换行符,原始字符串用“”来表示定界符,并使用前缀R来标识原始字符串。
输入原始字符串时,按回车键不仅会移到下一行,还将在原始字符串中添加回车字符。使用R“+
*标识原始字符串的结尾。

4.4 结构简介

创建结构:
1.定义结构描述,它描述并标记来能够存储在结构中的各种数据类型
2.按描述创建变量(结构数据对象)
struct Name
{
type1 name1;
type2 name2
};
使用时Name use{}然后使用成员运算符.来访问各个成员,use.name1,在使用时,使用逗号将数值隔开,用花括号括起。
放在函数中的是内部声明,放在函数外的是外部声明,外部声明可以被其后面的任何函数使用,而内部声明只能被该声明所属的函数使用。
可以将结构作为参数传递给函数,使用赋值运算符(=)将结构赋给另一个同类型的结构。
可以通过结构创建元素为结构的数组:struct_name array_name[size],实际上就是创建来一个类型为结构的数组。

4.5 共用体

共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中一种类型。可以看成是一个允许多种类型的变量,但是变量一次只能存储一种类型。
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
共用体也可以放在结构中。

4.6 枚举(enumeration)

enum spectrum {red,orange,yellow,green,blue,violet,indigo,ultraviolet};
其中,spectrum被称为枚举,里面否符号常量(red…)被叫做枚举量(enumerator),将整数值赋给枚举量,第一个枚举量的值为0,以此类推。
不能把非enum值赋值给enum值,就相当于枚举是一种类型,变成枚举类型的变量不能被其他类型赋值。
可以使用赋值运算符来显式设置枚举量的值,指定的数必须是整数,也可以只定义部分枚举量的值,后面没有被初始化的枚举量的值将比其前面的枚举量大1,还可以创建多个值相同的枚举量。
enum bits{one=1,two=2,four=4,eight=8}
枚举的取值范围的上限是枚举量的最大值的最小值的2的幂减1,只要在这个范围内,即使没有对应的枚举量,代码也是合法的。

4.7 指针和自由存储空间

指针是一个变量,其存储的值是值的地址,而不是值本身。地址运算符(&)
*运算符被称为间接值,该符号加在指针上可以得到对应地址的值。
指针声明必须指定指针指向的数据类型,type *adress=&value
计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存,所以之后的赋值可能会改变对应地址的值。
对于未分配的变量,new type根据类型来确定需要多少字节的内存,然后它找到这样的内存并返回其地址,type *adress=new type
delete运算符是的在使用完内存后能够将其归还给内存池,使用delete时,后面要加上指向内存块的指针,这样可以释放内存但不删除指针,不要使用delete来释放不是new分配的内存,不要使用delete释放同一个内存块两次,如果使用new[]为数组分配内存,则应使用delete[]来释放,如果使用new为一个实体分配内存,则应使用delete来释放内存。

4.8 指针、数组和指针算术

指针和数组基本等价,C++将数组名解释为地址,可以将数组名解释为数组第一个元素的地址,数组中的第几个元素就相当于初始地址向后移位。
对数组名应用地址运算符时,得到的是整个数组的地址。
C++允许将指针和整数相加,加1的结果等于原来的地址值加上指向的对象占用的总字节数。
用方括号数组表示法等同于对指针解除引用:
tacos[0] means * tacos means the value at address tacos
tacos[3] means * (tacos+3) means the value at address tacos+3
cout对象认为char的地址是字符串的地址,它将会打印该地址处的字符,然后继续打印后面的字符,直到遇到空字符为止。当数组第一个元素为char时,直接cout数组名就可以打印数组中的字符串。
一般来说,如果给cout提供一个指针,它将打印地址,但如果指针的类型为char*,则cout将显示指向的字符串。如果要显示的是字符串的地址,则必须将这种指针强制转换为另一种指针类型。
将new用于结构由两步构成:创建结构和访问其成员。创建结构和创建类型变量相似:struct_type *point=new struct_type,访问成员变量用箭头运算符(->),结构指针指向成员,可用于成员访问。结构标识符是结构名则用句点运算符,(*point也有句点运算符),标识符是指向结构的指针则使用箭头运算符。
C++管理内存有三种方式,自动存储、静态存储和动态存储。自动存储就是在函数使用时存在,函数结束时消亡,相当于是局部变量的存储,自动变量通常存储在栈中,按相反顺序释放,后进先出;静态存储是整个程序执行期间都存在的存储方式,一种是在函数外面定义它,另一种是在声明变量时使用关键字static;new和delete运算符提供了一种比自动变量和静态变量更灵活的方式,new和delete能够在一个函数中分配内存,在另一个函数中释放它,数据的生命周期不完全受程序或函数的生存时间控制,为了避免内存泄漏(无法访问分配出去的自由存储空间的内存),要同时使用new和delete。

4.9 类型组合

可以创建指向结构的指针,也可以创建结构数组,可创建指针数组(struct_type *point[size]={&1,&2,…})

4.10 数组的替代品

模版类vector和array
使用vector时要包含头文件#include< vector >,vector< type > name(n)(n可以是变量也可以是常量),是一种动态数组,可在运行阶段设置vector对象长度,可在末尾附加新数据,还可在中间插入新数据。
模版类array对象的长度是固定的,使用栈(静态内存分配),需要包含头文件#array< array >,array< type ,n> name(n只能是常量)
无论是数组、array还是vector,都可使用标准数组表示法来访问各个元素,array对象和数组存储在相同的内存区域(栈)中,而vector对象存储在另一个区域(自由存储区或栈)中,一个array可以赋给另一个array对象,但是数组必须逐元素复制数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值