目录
- 数组
- 字符串
- 结构体
- 共用体
- 枚举
- 指针
- 数和指针的关系
- 常见的存储方式
- 数组替代品
一、数组
- 存储在每个元素中值的类型
- 数组名
- 数组中的元素数
- 通用格式:typename arrayname [arraysize];
- 数组从0开始编号,在最后一个元的索引,比数组长度小1
- 初始化时可以用大括号{}为元素赋值,中间用逗号隔开。如果只对数组一部分进行赋值,则编译器把其他赋予0
- c++11新增数组初始化可以不用=。大括号可以不包含任何东西,默认全为0 。
- 禁止缩窄转换,如浮点型转整型,int a[]={3.6,1,2.0}; //is not allowed;
二、字符串
- 字符串输入
- cin通过空白(空格,制表符,换行符)来确定字符串结束的位置
- getline()函数通过回车和换行符来确定结束,属于每次读取一行字符串
- 调用该函数可使用cin.getline(变量名,长度)
- 当将一行数据输入到string类中:getline(cin,str),不需要大小参数
- get()函数中有一种变体属于面向行输入,跟geiline类似,但get不会丢弃换行符,需要调用get()函数不带参数的变体,否则将影响输入。
- cin.get((name,ArSize); cin.get(); 或者cin.get((name,ArSize).get();
- get读取空白行后将设置失效符,意味着接下来的输入将会被阻断
- 可以使用恢复命令cin.clear()
- 使用getline使输入方便,使用get使输入仔细,如知道停止输入的原因是已经读取到正整行数据,而不是数组过小。
- char 型数组
初始化:用一个双引号括起字符串 char a[6]="cheng",char a[]="cheng";
定义元素数量至少应该比字符串数量多1,因为自动追加\0,即数组要比字符串长。
字符串常量(使用双引号)不能和字符常量(使用单引号)互换
使用c语言库函数
- strlen(数组名)确定该数组字符串长度。
- sizeof(数组名)运算符指出整个数组的长度,strcpy(数组一,数组二)将数组2复制到数组1,数组一中原有数据清空,
- strncpy(数组一,数组二,字符数),比strcpy接受多一个参数,复制的数量
- strcat(数组1,数组2)将数组2追加到数组1中
- 注意添加头文件cstring,比较旧的编译器中为string.h。
- string类
- 使用string时要使用头文件,且在于using namespace std之前;string类隐藏了字符串的性质,让您能够像处理普通变量那样处理字符串。
- 运用时直接定义string类的对象为简单变量:string str1; string str2="chengjunfeng";
- 使用string对象时,能够自动处理string大小,从理论上来说,char数组可以看成一组储存一个字符串的char存储单元,而string类变量是一个表示字符串的实体。
- string简化了字符串合并的操作,直接使用运算符+将两个string对象结合起来,使用=将出现复制,也可以用+=将字符串追加到string对象末尾。str1.size()可以返回str1的长度大小。
- 通过运用行输入getline()函数,需要这样表示:getline(cin,str);因为getline不是string类的方法,它将cin作为参数,指出去哪里查找输入。
- 相对于数组,string不必担心字符串会越界以及可以更简单操作字符串
三、结构体
- 结构是类的基石,结构是用户定义的类型,而结构声明定义了这种类型数据的属性
- 结构的组成部分:
struct 标记新类型的名称名称
{
结构成员如
int a;
char b[5];
};
- 结构定义变量后,可以用运算符(.)来访问各个成员如:
struct cheng
{
int a;
};
cheng jun;
jun.a=12;
- 结构也可以定义结构数组变量,有着数组的特性;cheng feng[2]
- c++提倡使用外部结构声明,不提倡外部变量,
- 通过使用new创建动态结构:
- 创建结构
- 结构类型和new :要创建一个未命名的inflatable类型,并将地址付给一个指针
- iniflatable *ps=new inflatable/////把储存inflatable结构的一块可用内存地址赋给ps
- 访问其成员
- 创建动态结构不能通过成员运算符句点用于结构名,要用箭头成员运算符(->)
四、共用体
五、枚举
六、指针
- 计算机储存数据时必须跟踪3种基本特性:
-
- 信息储存在哪里
- 存储的值为多少
- 存储的信息是什么类型
- 指针是一个变量,用于储存值的地址,指针名表示的是地址,其储存的是值的地址而不是值本身,要找值的本身需要用解除引用符 * 。
- 常规变量可以用地址运算符 & 找到它的位置;显示地址时,cout使用16进制表示法。
- 声明和初始化指针:
类型 * 变量名; int* a;
- 一定要在对指针解除引用前,将指针初始化为一个确定、适当的地址。
- 当需要内存时用new获取,不需要时用delete归还给内存池
- new运算符:使用new,c++会自动为你分配内存
- 使用new自动赋予地址
- 类型 * 变量名 =new 类型 ; int* a=new int;
- 使用new 和delete 时要遵守一下规则
- 不要使用后delete 来释放不是new 分配的地址
- 不要使用delete释放一个内存块两次
- 如果使用new[ ]为数组分配内存,则应使用delete来释放
- 如果使用new为一个实体分配内存,则直接用delete来释放
- 对空指针使用delete是安全的
- 如果使用new后没有用delete释放内存,在自由存储空间上动态分配的变量或结构也将继续存在,实际上将会无法访问自由储存空间中的结构,因为指向这些内存的指针将无效,俗称“内存泄漏”。这些内存被分配出去但无法收回
- 避免造成内存泄漏将同时使用new和delete
- 如果给out提供一个指针,将打印其地址,如果指针为char*,则打印其指向的字符串,需打印地址,则必须将这种指针类型强制转化成另一种类型,如(int*)
七、数组和指针的关系
- 在编译时给数组分配内存时称为静态编联,即数组在编译时设置长度所需内存,使用new [ ] 的数组称为动态编联,即将在运行时自动为数组分配空间。在运行时需要就创建,不需要就不创建。特就是说运行时创建优于编译时创建。
- 数组名被解释为第一个元素的地址,但是运用了地址运算符时,得到的是整个数组的地址。
- 数组的本质是一种特殊的指针,数组的地址是连在一起的,指针是分散的;数组a[0]时指针指向第一个地址,当a[0+1]是指针自动跳到下一个地址,如数组a为int则&a[0]比&a[1]少8。
- 对于数组n:
-
- *(n+i)=n[i] //// n[0] 表示*n,即数组n的首地址。 n[3]表示*(n+3) 即数组n的首地址加3个单位
- 数组名被解释为第一个元素的地址,但是运用了地址运算符时,得到的是整个数组的地址
- 为数组分配内存的通用格式
-
- type _name * pointer_name =new type _name [num_elements] int *a=new int [3];
- 这样可以把指针名当做数组名使用
- c++允许将指针与整数相加减,指针数组P指的是P[0],P=P+1后P指向P[1],即指向指针的下一个元素地址。
- char 数组名、char指针及用引号括起来的字符串常量都被解释为字符串第一个字符的地址
八、常见的存储方式
- 自动存储
- 函数内部定义的常规变量使用自动存储空间,称为自动变量
- 函数调用时自动产生,函数结束时自动消亡
- 即自动存储的变量为局部变量
- 静态存储
- 函数外面的变量即全局变量
- 关键字static声名的变量
- 动态存储
- 使用new和delete管理内存池为变量分配地址,数据的生命周期不受程序和函数的生存空间控制
- 使用new和delete让我们使用内存有更大的管理权
九、数组替代品
- 模板类vector
- vector是一种动态数组,他是使用new创建动态数组的替代品,内部自动使用new和delete来管理内存。
- 使用vector对象,首先要包含头文件vector,它包含在空间std中,所以要在using之前使用头文件
- vector<数据类型> 对象名 (长度,满了之后扩充数量);
- 可以在运行时设置vector对象长度,可在末尾追加新数据也可以在中间插入数据
- vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。
- 模板类arrary(c++11)
- 创建array对象,需添加arrary头文件
- arrary<typename,长度> 对象
- 可以将一个arrary对象赋予另一个arrary对象
原文地址:https://www.cnblogs.com/niliuxiaocheng/p/9902566.html
时间: 2024-10-07 23:12:06