数组
数组:一种数据格式,能够存储多个同类型数据
数组声明:1、类型 2、数组名 3、数组中的元素数
Eg: typename array[arraySize]
arraySize:不能是变量,但可以用new()运算符避开
数组初始化规则:
- 提供的元素 <= arraySize
- Float array[50] = {0}
- Float array[ ] = {1,2,3} 此时 c++编译器将计算数组元素个数
C++11 新增规则:
- 初始化数组时,可以省略等号(=)
Eg: int array[4] {1,2,3,4}
- 可不在大括号里面包含任何东西
Eg:int array[4] {}
- 列表初始化禁止缩窄转换(浮点数转换成整形)
字符串
定义:存储在内存的连续字节中的一系列字符
使用方法:
<1> char 方法:
不是字符串
是字符串
字符串常量(字符串字面值):使用一个引号括起字符串
使用单引号时,将把字符串的ASCII码值赋值给变量
隐式地包括结尾的空字符
注意:确定存储字符串的最短数组时,要把空字符算进去
<2>string 方法
使用标准头文件 #include<string>
与字符数组区别:可以将string对象声明为简单变量,而不是数组。类设计让程序能够自动处理string的大小。String对象更方便,也更安全。String类具有自动调整大小的功能,不会破坏数据
C++字符串初始化
计算字符串长度:array_name.size() 或者 strlen(array_name)
面向行的输入:getline() 和 get()
Getline()将丢弃换行符,而get()将换行符保留在输入序列中
getline()
意义:读取整行,它使用通过回车键输入的换行符来确认结尾。
方法:cin.getline(数组名,字符数)
#getline() 成员函数在读取指定数目的字符或遇到换行符时停止读取
该函数有两个参数:
第一个参数用来输入行的数组的名称,第二个参数要读取字符数,还可以接收第三个可选参数
Eg: cin.getline(name,20)
最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符
get()
因为get会将换行符保留在输入队列中,因此再次调用时看到的第一个字符便是换行符
Eg:
解决办法:
方法一:
cin.get(name, SIZE);
cin.get();
cin.get(dessert, SIZE);
方法二:
cin.get(name, SIZE).get();
cin.get(dessert, SIZE).get();
可以这么写的原因:cin.get(name,ArSize) 返回一个对象,该对象随后将被用来调用get() 函数。类比可得: cin.getline(name1 , ArSize) . getline(name2 , ArSize) ;
注意:尽量使用 get()
混合输入字符串和数字:
# ( cin >> year) . get() ; 或者 ( cin >> year ) . get( ch ) ;
结构简介
介绍:结构是用户定义的类型,而结构声明定义了这种类型的数据属性
意义:同一结构可以存储多种类型的数据
创建步骤:1、定义结构描述(描述并标记能够存储在结构中的各种数据类型)
2、描述创建结构变量(结构数据对象)
关键字struct
标记成为新类型的名称 Person_information
列表存有 char、int、float,因此 Person_information结构含有三个成员
结构定义了指出新类型(Person_information)的特征
创建类型的变量:
成员运算符:( . ) 用来各个成员
结构声明位置的区别:
- 外部声明:可以被其后面的任何函数使用
- 局部声明:只能被该声明所属的函数使用
结构体初始化:(等号 = 是可以选择不加入的)
结构数组:
共用体
关键字:union (用法与结构体相似)
概念:一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型
用途:当数据项使用两种或更多种格式(但不会同时使用)时,可以节省空间;常用于操作系统数据结构或硬件数据结构
注意:成员名称标识了变量的容量,由于共用体每次只能存储一个值,因此它必须有足够的空间来存储最大的成员,所以,共用体长度为其最大成员的容量
枚举
关键字: enum (用法与结构体相似)
举例:
用法:在默认情况下,将整数值赋给枚举量,第一个枚举量的值为0,第二个枚举量的值是1,以此类推。可以通过显示地指定整数值来覆盖默认值、
设置枚举量的值:
- 可以使用赋值运算符来显示地设置枚举量的值
- 指定的值必须为整数,也可以只显示地定义其中一些枚举量的值
- 可以创建多个值相同的枚举量
枚举的取值范围:
定义:首先找出上线,知道枚举量的最大值。找到大于最大值的最小的二进制的幂,并将它减1,eg: 101 à 127。
其次,计算下限,知道枚举量的最小值。如果它不小于零,贼取值范围下限为零;否则,与寻找上限相似,不过要加上负号
指针和自由存储空间
指针:
用途:用于存储值的地址。因此,指针名表示地址
(*)运算符:被称为间接值或解引用运算符,可以得到地址存储的值
Eg:假设manly是一个指针,则&manly表示一个地址,则*manly表示存储在该地址处的值。
声明和初始化指针:
Typename* 指针名
注意:
- 指针变量不仅仅是指针,而且是指向特定类型的指针。double* num 和 int* name 是不同类型的指针
- 地址的长度或值既不能指示关于变量的长度或类型的任何信息,也不能指示改地址上有什么建筑物。一般来说,地址需要2或4字节,取决于计算机系统。
初始化:
- 声明语句中初始化指针。这种情况,被初始化的是指针,而不是它指向的值。例子中初始化的是p(而不是*p),将num的地址赋给p。
指针的危险:
创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向数据的内存。因此,一定要在对指针应用解引用运算符(*)之前,使指针初始化。
使用new来分配内存:
运用指针,在运行阶段分配未命名的内存以存储值
格式:
Eg:
#new 的作用:程序员告诉指针需要哪种数据类型分配地址,new将找到一个长度正确的地址,并返回该内存块的地址。程序员的责任是将该地址赋给一个指针。
数据对象:为数据项分配的内存块,它的范围比“变量”更为广泛。
示例中,pn所指向的是一个数据对象
#new分配的内存块与常规变量分配的内存块区别:new分配的内存块在堆区,而常规变量分配的内存块在栈区。
注意:不要创建;两个指向同一内存块的指针,这将增加错误地删除同一内存块两次的可能性
使用new来创建动态数组:
- 静态联编:
在编译时给数组分配内存。这就意味着数组是在编译时加入到程序中,在编写程序时指定数组的长度
- 动态联编:
在运行阶段需要数组,则创建它;如果不需要,则不创建。还可以在程序运行时选择数组长度(动态数组)。
Eg:
使用动态联编:
使用new创建动态结构:
步骤:创建结构和访问成员
- 创建结构
- 访问成员
运算符: (->)箭头成员运算符
作用:可用于指向结构的指针
两种访问方法:
- b.
句点运算符和箭头运算符运用时机:
句点:结构标识符是结构名
箭头:标识符是指向结构的指针
使用delete释放内存:
格式:delete 指针名;
Eg:
示例中会释放pn指向的内存,但不会删除指针pn本身,可以将pn重新指向另一个新分配的内存块
#new和delete使用规则:
- 不要使用delete来释放不是new分配的内存
- 不要使用delete释放同一内存块两次
- new格式和delete格式对应(是否有“()”或“[ ]”)
- 对空指针应用delete是安全的
数组替代品
模板类vector
意义:可以在运行阶段设置vector对象的长度,可在末尾附加新数据,可在中间插入新数据
用法:
头文件:#include<vector>
# vector<Type_name>name(n_elem)
# n_elem可以是整型常量,也可以是整型变量
Eg:
模板类array
用法:
头文件 #include<array>
# array<Type_name , n_elem>arr_name;
在array中 n_name 不能是变量
拓展
Sizeof(array)和strlen(array)区别
- sizeof 指出整个数组的长度
- strlen() 返回的是存储在数组中的字符串长度。只计算可见的字符,而不包括空字符
cin确定已完成字符串输入方法:
cin使用空白(空格,制表符,换行符)来确定字符串的结束位置
面向对象——运行阶段:程序正在运行时(更灵活)
面向过程——编译阶段:编译器将程序组合起来
使用常规变量时,值是指定的量,地址是派生量
指针(处理存储数据的新策略),将地址视为指定的量,值是派生量
C与C++的优势之一:数组和指针基本等价
自动存储、静态存储和动态存储区别:
1、自动存储
自动变量:在函数内部定义的常规变量使用自动存储空间
意义:它们在所属的函数被调用时自动产生,在函数结束时自动消亡
自动变量通常存储在栈区
自动变量实际上是一个局部变量,其作用域为包含它的代码块
生命周期:在特定函数被执行时存在
2、静态存储
整个程序在执行期间都存在的存储方式
使用方法:
-
- 在函数外面定义它
- 在声明变量时使用关键字 static (中文:静态)
Static typename bianlian_name ;
生命周期:存在于程序的整个生命周期
3、动态存储
申请用于存放X类型对象的内存空间,并依初值列表赋以初值
数组
数组:一种数据格式,能够存储多个同类型数据
数组声明:1、类型 2、数组名 3、数组中的元素数
Eg: typename array[arraySize]
arraySize:不能是变量,但可以用new()运算符避开
数组初始化规则:
- 提供的元素 <= arraySize
- Float array[50] = {0}
- Float array[ ] = {1,2,3} 此时 c++编译器将计算数组元素个数
C++11 新增规则:
- 初始化数组时,可以省略等号(=)
Eg: int array[4] {1,2,3,4}
- 可不在大括号里面包含任何东西
Eg:int array[4] {}
- 列表初始化禁止缩窄转换(浮点数转换成整形)
字符串
定义:存储在内存的连续字节中的一系列字符
使用方法:
<1> char 方法:
不是字符串
是字符串
字符串常量(字符串字面值):使用一个引号括起字符串
使用单引号时,将把字符串的ASCII码值赋值给变量
隐式地包括结尾的空字符
注意:确定存储字符串的最短数组时,要把空字符算进去
<2>string 方法
使用标准头文件 #include<string>
与字符数组区别:可以将string对象声明为简单变量,而不是数组。类设计让程序能够自动处理string的大小。String对象更方便,也更安全。String类具有自动调整大小的功能,不会破坏数据
C++字符串初始化
计算字符串长度:array_name.size() 或者 strlen(array_name)
面向行的输入:getline() 和 get()
Getline()将丢弃换行符,而get()将换行符保留在输入序列中
getline()
意义:读取整行,它使用通过回车键输入的换行符来确认结尾。
方法:cin.getline(数组名,字符数)
#getline() 成员函数在读取指定数目的字符或遇到换行符时停止读取
该函数有两个参数:
第一个参数用来输入行的数组的名称,第二个参数要读取字符数,还可以接收第三个可选参数
Eg: cin.getline(name,20)
最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符
get()
因为get会将换行符保留在输入队列中,因此再次调用时看到的第一个字符便是换行符
Eg:
解决办法:
方法一:
cin.get(name, SIZE);
cin.get();
cin.get(dessert, SIZE);
方法二:
cin.get(name, SIZE).get();
cin.get(dessert, SIZE).get();
可以这么写的原因:cin.get(name,ArSize) 返回一个对象,该对象随后将被用来调用get() 函数。类比可得: cin.getline(name1 , ArSize) . getline(name2 , ArSize) ;
注意:尽量使用 get()
混合输入字符串和数字:
# ( cin >> year) . get() ; 或者 ( cin >> year ) . get( ch ) ;
结构简介
介绍:结构是用户定义的类型,而结构声明定义了这种类型的数据属性
意义:同一结构可以存储多种类型的数据
创建步骤:1、定义结构描述(描述并标记能够存储在结构中的各种数据类型)
2、描述创建结构变量(结构数据对象)
关键字struct
标记成为新类型的名称 Person_information
列表存有 char、int、float,因此 Person_information结构含有三个成员
结构定义了指出新类型(Person_information)的特征
创建类型的变量:
成员运算符:( . ) 用来各个成员
结构声明位置的区别:
- 外部声明:可以被其后面的任何函数使用
- 局部声明:只能被该声明所属的函数使用
结构体初始化:(等号 = 是可以选择不加入的)
结构数组:
共用体
关键字:union (用法与结构体相似)
概念:一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型
用途:当数据项使用两种或更多种格式(但不会同时使用)时,可以节省空间;常用于操作系统数据结构或硬件数据结构
注意:成员名称标识了变量的容量,由于共用体每次只能存储一个值,因此它必须有足够的空间来存储最大的成员,所以,共用体长度为其最大成员的容量
枚举
关键字: enum (用法与结构体相似)
举例:
用法:在默认情况下,将整数值赋给枚举量,第一个枚举量的值为0,第二个枚举量的值是1,以此类推。可以通过显示地指定整数值来覆盖默认值、
设置枚举量的值:
- 可以使用赋值运算符来显示地设置枚举量的值
- 指定的值必须为整数,也可以只显示地定义其中一些枚举量的值
- 可以创建多个值相同的枚举量
枚举的取值范围:
定义:首先找出上线,知道枚举量的最大值。找到大于最大值的最小的二进制的幂,并将它减1,eg: 101 à 127。
其次,计算下限,知道枚举量的最小值。如果它不小于零,贼取值范围下限为零;否则,与寻找上限相似,不过要加上负号
指针和自由存储空间
指针:
用途:用于存储值的地址。因此,指针名表示地址
(*)运算符:被称为间接值或解引用运算符,可以得到地址存储的值
Eg:假设manly是一个指针,则&manly表示一个地址,则*manly表示存储在该地址处的值。
声明和初始化指针:
Typename* 指针名
注意:
- 指针变量不仅仅是指针,而且是指向特定类型的指针。double* num 和 int* name 是不同类型的指针
- 地址的长度或值既不能指示关于变量的长度或类型的任何信息,也不能指示改地址上有什么建筑物。一般来说,地址需要2或4字节,取决于计算机系统。
初始化:
- 声明语句中初始化指针。这种情况,被初始化的是指针,而不是它指向的值。例子中初始化的是p(而不是*p),将num的地址赋给p。
指针的危险:
创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向数据的内存。因此,一定要在对指针应用解引用运算符(*)之前,使指针初始化。
使用new来分配内存:
运用指针,在运行阶段分配未命名的内存以存储值
格式:
Eg:
#new 的作用:程序员告诉指针需要哪种数据类型分配地址,new将找到一个长度正确的地址,并返回该内存块的地址。程序员的责任是将该地址赋给一个指针。
数据对象:为数据项分配的内存块,它的范围比“变量”更为广泛。
示例中,pn所指向的是一个数据对象
#new分配的内存块与常规变量分配的内存块区别:new分配的内存块在堆区,而常规变量分配的内存块在栈区。
注意:不要创建;两个指向同一内存块的指针,这将增加错误地删除同一内存块两次的可能性
使用new来创建动态数组:
- 静态联编:
在编译时给数组分配内存。这就意味着数组是在编译时加入到程序中,在编写程序时指定数组的长度
- 动态联编:
在运行阶段需要数组,则创建它;如果不需要,则不创建。还可以在程序运行时选择数组长度(动态数组)。
Eg:
使用动态联编:
使用new创建动态结构:
步骤:创建结构和访问成员
- 创建结构
- 访问成员
运算符: (->)箭头成员运算符
作用:可用于指向结构的指针
两种访问方法:
- b.
句点运算符和箭头运算符运用时机:
句点:结构标识符是结构名
箭头:标识符是指向结构的指针
使用delete释放内存:
格式:delete 指针名;
Eg:
示例中会释放pn指向的内存,但不会删除指针pn本身,可以将pn重新指向另一个新分配的内存块
#new和delete使用规则:
- 不要使用delete来释放不是new分配的内存
- 不要使用delete释放同一内存块两次
- new格式和delete格式对应(是否有“()”或“[ ]”)
- 对空指针应用delete是安全的
数组替代品
模板类vector
意义:可以在运行阶段设置vector对象的长度,可在末尾附加新数据,可在中间插入新数据
用法:
头文件:#include<vector>
# vector<Type_name>name(n_elem)
# n_elem可以是整型常量,也可以是整型变量
Eg:
模板类array
用法:
头文件 #include<array>
# array<Type_name , n_elem>arr_name;
在array中 n_name 不能是变量
拓展
Sizeof(array)和strlen(array)区别
- sizeof 指出整个数组的长度
- strlen() 返回的是存储在数组中的字符串长度。只计算可见的字符,而不包括空字符
cin确定已完成字符串输入方法:
cin使用空白(空格,制表符,换行符)来确定字符串的结束位置
面向对象——运行阶段:程序正在运行时(更灵活)
面向过程——编译阶段:编译器将程序组合起来
使用常规变量时,值是指定的量,地址是派生量
指针(处理存储数据的新策略),将地址视为指定的量,值是派生量
C与C++的优势之一:数组和指针基本等价
自动存储、静态存储和动态存储区别:
1、自动存储
自动变量:在函数内部定义的常规变量使用自动存储空间
意义:它们在所属的函数被调用时自动产生,在函数结束时自动消亡
自动变量通常存储在栈区
自动变量实际上是一个局部变量,其作用域为包含它的代码块
生命周期:在特定函数被执行时存在
2、静态存储
整个程序在执行期间都存在的存储方式
使用方法:
-
- 在函数外面定义它
- 在声明变量时使用关键字 static (中文:静态)
Static typename bianlian_name ;
生命周期:存在于程序的整个生命周期
3、动态存储
申请用于存放X类型对象的内存空间,并依初值列表赋以初值