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

关于c++中的复合类型的更多相关文章

  1. c++中的复合类型

    复合类型是指基于其他类型而定义的类型. 而这里介绍的是引用和指针.并且指针和引用都提供了对其他对象的间接访问. 引用 引用还是很好理解的,就是为对象起了另外一个名字,引用类型引用另外一种类型. 通常将 ...

  2. C语言中的复合类型

    复合类型 一.掌握的类型 1. 指针数组 int * arr[10]; //arr是一个数组,有10个元素,每个元素都是一个指针,即arr是一个指针数组 int a,b,c,d; arr[0] = & ...

  3. 带你学够浪:Go语言基础系列 - 8分钟学复合类型

    ★ 文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) " 对于一般的语言使用者来说 ,20% ...

  4. Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  5. lua 中protobuf repeated 嵌套类 复合类型

    PB基础知识科普 syntax = "proto2"; package PB; message Item { required string name = ; } message ...

  6. 第54讲:Scala中复合类型实战详解

    今天学习了scala的复合类型的内容,让我们通过实战来看看代码: trait Compound_Type1trait Compound_Type2class Compound_Type extends ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (35) ------ 第六章 继承与建模高级应用之TPH继承映射中使用复合条件

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-11  TPH继承映射中使用复合条件 问题 你想使用TPH为一张表建模,建模中使 ...

  8. 实现在GET请求下调用WCF服务时传递对象(复合类型)参数

    WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...

  9. go语言 类型:基础类型和复合类型

    Go 语言中包括以下内置基础类型:布尔型:bool整型:int int64 int32 int16 int8 uint8(byte) uint16 uint32 uint64 uint浮点型:floa ...

随机推荐

  1. request 中url拼接排序参数与签名算法

    一.参数要求: { appId:应用在后台创建应用时分配的应用编号,与应用密钥一一对应 sign:按照当前请求参数名的字母序进行升序排列(排序时区分大小写,除sign外,其它值不为空的参数都参与签名) ...

  2. ubuntu18.04安装nvidia驱动总结经验

    本人电脑是 DELL Inspiron 3670, 系统装的是ubuntu18.04, 显卡使用的是GeForce GTX 1050 Ti, 在安装nividia显卡的时候花费两天时间,感受颇深,顾总 ...

  3. error: 'commit' is not possible because you have unmerged files.

    解决方案: 1.把修改的文件add下,如:git add bidder_mod/src/common/dragon_bidder_data.cc2.git commit

  4. Excel催化剂开源第48波-Excel与PowerBIDeskTop互通互联之第二篇

    前一篇的分享中,主要谈到Excel透视表连接PowerBIDeskTop的技术,在访问SSAS模型时,不止可以使用透视表的方式访问,更可以发数据模型发起DAX或MDX查询,返回一个结果表数据,较透视表 ...

  5. 将web工程署到Linux简单实现

    1,将数据库文件导出并导入到Linux下的数据库中 2,将数据库连接池的连接IP改为Linux所在服务器的 3,将工程文件以war包形式导出 4,利用secureCRT,Xshell等工具远程连接Li ...

  6. Hive之函数与自定义函数

    系统自带的函数 1)查看系统自带的函数 hive> show functions; 2)显示自带的函数的用法 hive> desc function upper; 3)详细显示自带的函数的 ...

  7. 推荐:经典SQL语句大全

    一.基础 .说明:备份sql server--- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mss ...

  8. [译].Net中的内存

    原文链接:https://jonskeet.uk/csharp/memory.html 人们在理解值类型和引用类型之间的差异时因为“值类型在栈上分配,引用类型在堆上分配”这句话造成了很多混乱.这完全是 ...

  9. vue更改了数据但是视图却没有更新

    今日总结:让钩子函数背锅的一上午,跪求原谅 需求:页面刷新时,保留当前页面的选中状态 解决思路:在data里设置一下初始值,保证首次进入有默认选中状态,其次再操作时,把选中的状态存sessionSto ...

  10. poj 2503 Babelfish(字典树或map或哈希或排序二分)

    输入若干组对应关系,然后输入应该单词,输出对应的单词,如果没有对应的输出eh 此题的做法非常多,很多人用了字典树,还有有用hash的,也有用了排序加二分的(感觉这种方法时间效率最差了),这里我参考了M ...