C/C++复合数据类型 壹(数组、结构)

数组

  • 数组的意义、定义与创建
  • 一、二维数组应用
  • 字符数组与字符串处理函数
  • 数组与指针———关系密切

  • 数组的意义与定义创建

意义:反映数据间的特点(通过把同一类数据归纳,就形成了数组)和提高处数据的效率(通过数组与循环二者相配合,可以快速处理大量数据)

定义:一个数组元素是同一种数据类型的有序集合,数组通过下标运算符 [] 来访问数组中的元素,数组元素的序号数比数组元素下表数大1⃣️,数组中的元素是连续排列的,二维数组一是连续排列的



一维数组的创建:先声明后使用。格式为 数据类型 数组名[n](例如:int ar[10],创建一个10个元素的数组),可以通过 数组名[x] 来访问数组的第x+1个元素注意使用数组不要越界否则可能会使程序崩溃。

数组的初始化:1. 通过循环遍历数组,从而初始化。2. 通过初始化列表去初始化(int ar[3]={1,2,3},)这时可省去 数组名后[]中的参数(因为系统可以根据数组初始化列表的参数去推断个数),还有如果只给初始化列表中的前几个元素赋值,其他值会被自动初始化为零二维数组亦是同理。

二维数组的创建:与一维数组创建相似,格式为:数组名[m][x],其中m表示行数,n表示列数,可以通过for循环去遍历数组。

初始化详解:

  • 直接初始化方式
  1. int array1[2][3] = {1,2,3,4,5,6}; //定义时直接初始化
  2. int array2[][3] = {1,2,3,4,5,6}; //根据给出的初始化列表元素个数,编译器自动填补“行”
  3. int array3[2][] = {1,2,3,4,5,6}; //根据给出的初始化列表元素个数,编译器自动填补“列”
  • 赋值方式
  1. int array4[2][3]; //默认未被初始化(除非为全局数组),元素值未知
  2. for(int i=0; i<2; i++) //行
  3. for(int j=0; j<3; j++) //列
  4. array4[i][j] = i*j+j;
  • 部分初始化
  1. int array5[2][3] = {{1,2,3}}; //理论上应该使用这种形式,一目了然,但是注意内部每个花括号的元素个数一定要等于列数;其它未给出值的数组元素默认初始化为0
  2. int array5[2][3] = {1,2,3}; //此方式也可行;其它未给出值的数组元素默认初始化为0

三维数组与二维数组相似格式如下:数组名[a][b][c]

深入理解二三位数组:C/C++中,其实根本不存在二维数组这样一种数据类型,它其实是数组元素同样为数组的等效,因此我们可以把二维数组看成是数组的数组。

二维数组有多种创建方式,可根据不同的应用场景进行切换,还可以吧二三维数组当成一维数组用。

数组的优缺点

  • 优点:顺序存储,快速访问

缺点:

需要时刻检查是否越界,一旦越界,整体程序有可能崩溃;

数组规模事先要确定,后续不可变化;

可能会浪费掉内存空间;

事先要清楚系统 平台所支持的最大栈数组,一般情况下不建议超过4MByte

字符数组与字符串处理函数

字符数组概述:字符型数据以ASCII码代码存储在存储单元中,一般占一个字节。由于ASCII代码也是雨整数行,因此可以把字符型归纳为整形类型中的一种。(在C语言中没有字符串类型,而C++中却有string类型可以定义字符串类型)

  • 注意:在数组中 '\0’为字符串结束标志符系统自动添加
  1. //字符串数组初始化举例
  2. char c[10]={'I','a','m',' ','a','b','o','y'} //只初始化了前8个后两个没有初始化的全部设置为 '\0'
  3. char diamond[5][5]={
  4. {' ',' ','*'}, {' ','*',' ','*'},{ },{ },{ }
  5. } //只初始化数组第一排第二排,只要有一个元素初始化,其他都会被默认初始化为 '\0'
  1. // scanf 输入,printf 输出
  2. //scanf 对字符类型有 %c 和 %s 两种格式(printf 同理,下同),其中 %c 用来
  3. //输入单个字符,%s 用来输入一个字符串并存在字符数组里。%c 格式能识别 空格 跟 换行
  4. //并将其输入,而 %s 通过 空格 或 换行 来识别一个字符串的结束。
  5. //示例:
  6. #include<stdio.h>
  7. int main()
  8. {
  9. char s[10];
  10. scanf("%s",str);
  11. printf("%s",str);
  12. return 0;
  13. }
  14. 输入:TAT TAT TAT
  15. 输出:TAT

C/C++语言字符串处理函数

  1. puts()函数——输出字符串的函数
  1. char str[]={"China\nBejing"};
  2. puts(str);
  3. 输出//Chin a
  4. //Bejing
  1. gets()函数——从键盘输入向字符中的输入函数
  1. get(str);
  2. 从键盘输入: Computer
  3. Computer被存入str
  1. strcat(str1,str2)——字符串拼接函数//作用是将字符串str2,拼接并放入到str1数组中(但是前提是str1要足够能够装下str1和str2)
  1. strcpy(str1,str2)与strncpy(str1,str2,n)

    注意strcpy() 是str2复制到str1(必须自己保证str1的空间可以装下str2).

    而strncpy() 则是已经确定最多只能复制str2中n个字符到str1中。
  2. strcmp(str1,str2)——字符串比较函数

    根据ASCLL码比较大小,在比较时通过对应字母从前往后一个一个比较 只要有一个字符ASCLL码大的为大

    如果str1=str2则函数返回值为0

    如果str1>str2则函数返回值为正数

    如果str1<str2则函数返回值为负值
  3. strlwr(字符串)、strupr(字符串)分别把字符串转换为小写、大写

数组与指针

概述:数组与指针关系密切.数组名为地址可以用于给指针赋值,又可以通过 取地址运算符& 作用于数组元素,这样可以获取该元素的地址,用与指针赋值,而指针又可以通过 指针运算 去访问甚至是改变数组元素值。数组的元素又可以是指针

附上深入理解数组与指针的深入理解


结构

  • 结构存在的意义
  • 定义结构并应用
  • 定义结构数组并应用

结构存在的意义

在之前的学过的数据类型中,如 基本类型(int、double、char string)数组 共用体等均只能存储一种数据类型,结构体的存在可以同时存储多种数据类型。结构是用户定义的类型,所以要想使用它就必须第一步先定义这个 结构类型,第二步再通过这个结构类型去声明 一个结构变量(结构对象)。

定义结构并应用

  1. #include<iostream>
  2. using namespace std;
  3. //使用结构第一步
  4. //注意结构必须定义在main函数外边,在main函数内声明使用
  5. struct jie_gou_ming
  6. {
  7. //里边可以包含各种数据类型
  8. int a;
  9. double b;
  10. char c[10];
  11. };
  12. int main()
  13. {
  14. //声明结构变量 并进行列表{}初始化
  15. jie_gou_ming bian_liang={
  16. 10,
  17. 3.9,
  18. {"Hollow"}
  19. };
  20. //访问结构变量(通过'.'运算符来访问)成员并赋值
  21. cout<<bian_liang.a<<endl;
  22. bian_liang.a=100;
  23. cout<<bian_liang.a<<endl;
  24. cout<<bian_liang.c<<endl;
  25. return 0;
  26. }
  27. //第二步声明结构变量并初始化
  • 创建无名结构

  1. #include <iostream>
  2. using namespace std;
  3. //创建无名结构并且直接声明(无名结构的)结构变量,并对她它进行初始化
  4. struct
  5. {
  6. double a;
  7. char ar[8]={"Good"};
  8. } bian_liang={
  9. 10.9,
  10. "boy"
  11. };
  12. int main()
  13. {
  14. cout<<bian_liang.ar; //结构成员的调用
  15. return 0;
  16. }

定义结构数组并应用

  • 概述

结构数组指的是 可以用自己定义的结构类型去声明一个数组(这样做一次可以声明多个 结构变量),该数组的元素为 结构变量,所以该数组就叫 结构数组,数组中的每一个元素都可以访问它自己的成员

  • 声明结构数组
  1. #include<iostream>
  2. using namespace std;
  3. struct inflatable //定义结构inflatable
  4. {
  5. char name[20];
  6. float volume;
  7. double price;
  8. };
  9. int main()
  10. {
  11. //声明结构数组并初始化结构数组(通过初始化列表)
  12. inflatable guests[2]={
  13. {"Bob",0.5,99},
  14. {"xiao ming",1.5,100}
  15. };
  16. cout<<guests[0].name<<endl;//调用成员函数
  17. cout<<guests[1].name<<endl;
  18. //赋值
  19. guests[1].price=666;//赋值修改
  20. cout<<guests[1].price;
  21. return 0;
  22. }

结构与指针

概述:

结构与指针的关系有三方面

  1. 可以在结构定义中把指针作为成员函数
  1. struct inflatable //定义结构inflatable
  2. {
  3. int * ptr; //结构成员为指针
  4. };
  1. 可以把指针 定义为结构变量
  1. #include<iostream>
  2. using namespace std;
  3. struct inflatable //定义结构inflatable
  4. {
  5. int * ptr;
  6. };
  7. int main()
  8. {
  9. inflatable *p;
  10. p->ptr=NULL;
  11. return 0;
  12. }
  1. 可以使用 指针去(注意该指针的类型) 指向结构变量,从而访问结构的成员
  1. #include<iostream>
  2. using namespace std;
  3. struct inflatable //定义结构inflatable
  4. {
  5. int * ptr;
  6. };
  7. int main()
  8. {
  9. inflatable *p;
  10. inflatable Guest={
  11. NULL
  12. };
  13. p=&Guest; //将指针指向Guest的地址
  14. p->ptr;//用指针访问Guest的成员ptr;
  15. return 0;
  16. }

C/C++知识总结 五 复合数据类型 壹(数组、字符串与string、结构)的更多相关文章

  1. [日常] Go语言圣经--复合数据类型,数组习题

    go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...

  2. js数据类型以及数组字符串常用方法

    JS判断数据类型 例子: var a = "iamstring."; var b = 222; var c= [1,2,3]; var d = new Date(); var e ...

  3. ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

    这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  4. Python基础知识(五)

    # -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春药# @Email : zhou_wanchun@qq.com# @Fi ...

  5. Redis五种数据类型应用场景

    目录 1.1 回顾 2.1 应用场景 2.1.1 String 2.1.2 Hash 2.1.3 List 2.1.4 Zet 2.1.5 zset 3.1 小结 1.1 回顾 Redis的五种数据类 ...

  6. redis五种数据类型的使用(zz)

    redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...

  7. redis五种数据类型的使用

    redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...

  8. [五]基础数据类型之Short详解

      Short 基本数据类型short  的包装类 Short 类型的对象包含一个 short 类型的字段      原文地址:[五]基础数据类型之Short详解   属性简介   值为  215-1 ...

  9. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

随机推荐

  1. git删除远程仓库中的文件夹

    具体操作如下: git rm -r --cached .history    #删除目录 git commit -m”删除.history文件夹” git push -r表示递归所有子目录,如果你要删 ...

  2. win下安装virtualenv和创建django项目

    一.由于一直在Linux环境下开发,想了解一下winPython开发环境: 1.打开cmd,pip install virtualenv 2.virtualenv test 由于这样需要进入到目录下才 ...

  3. C# .Net Core 3.1 中关于Process.Start 启动Url链接的问题

    WPF 项目迁移到.Net Core中时居然出了一堆问题...(很无语) 今天在使用的时候居然发现Process.Start居然打不开Url链接了? 报 找不到指定文件 的异常?! 一.bug重现 首 ...

  4. ML-Agents(二)创建一个学习环境

    ML-Agents(二)创建一个学习环境 一.前言 上一节我们讲了如何配置ML-Agents环境,这一节我们创建一个示例,主要利用Reinforcement Learning(强化学习). 如上图,本 ...

  5. h5微信中视频禁止全屏

    <video id="videoPlayer" v-show="isShowVideo" class="video" ref=&quo ...

  6. js 统计一个字符串中出现的字符最多的字符

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Docker 技术系列之安装多版本Mysql5.6和Mysql5.7

    大家好,后面的就不是关于MAC专有的内容,基本是跟Java环境,基础技术方面有关.所以这个教程对于在linux系统还是macOS都是通用的,不用担心. 上一篇,我们安装好对应的Docker之后,感受到 ...

  8. 【Win10】我们无法更新系统保留的分区

      前言 笔者是一个萌新,这个方案也是慢慢摸索出来的,有更好的方案欢迎大家提出 前段时间用公司电脑发现win10新版本还行,回家升级自己的电脑却提示“我们无法更新系统保留的分区”.(O_o)?? 笔者 ...

  9. 【原创】Java并发编程系列1:大纲

    [原创]Java并发编程系列1:大纲 一个人能力当中所蕴藏的潜能,远超过自己想象以外. 为什么要学习并发编程 随着现今互联网行业的迅猛发展,其业务复杂度.并发量也在不断增加,对程序的要求变得越来越高, ...

  10. javascript中indexOf()和lastIndexOf()详解

    ECMAScript5为数组实例添加两方法:indexOf()和lastIndexOf().这两个方法接受两个参数:要查找的项和(可选的)表示查找起点位置的索引.其中,indexOf()方法从数组的开 ...