C/C++知识总结 五 复合数据类型 壹(数组、字符串与string、结构)
C/C++复合数据类型 壹(数组、结构)
数组
- 数组的意义、定义与创建
- 一、二维数组应用
- 字符数组与字符串处理函数
- 数组与指针———关系密切
- 数组的意义与定义创建
意义:反映数据间的特点(通过把同一类数据归纳,就形成了数组)和提高处数据的效率(通过数组与循环二者相配合,可以快速处理大量数据)
定义:一个数组元素是同一种数据类型的有序集合,数组通过下标运算符 [] 来访问数组中的元素,数组元素的序号数比数组元素下表数大1⃣️,数组中的元素是连续排列的,二维数组一是连续排列的
一维数组的创建:先声明后使用。格式为 数据类型 数组名[n](例如:int ar[10],创建一个10个元素的数组),可以通过 数组名[x] 来访问数组的第x+1个元素注意使用数组不要越界否则可能会使程序崩溃。
数组的初始化:1. 通过循环遍历数组,从而初始化。2. 通过初始化列表去初始化(int ar[3]={1,2,3},)这时可省去 数组名后[]中的参数(因为系统可以根据数组初始化列表的参数去推断个数),还有如果只给初始化列表中的前几个元素赋值,其他值会被自动初始化为零二维数组亦是同理。
二维数组的创建:与一维数组创建相似,格式为:数组名[m][x],其中m表示行数,n表示列数,可以通过for循环去遍历数组。
初始化详解:
- 直接初始化方式
int array1[2][3] = {1,2,3,4,5,6}; //定义时直接初始化
int array2[][3] = {1,2,3,4,5,6}; //根据给出的初始化列表元素个数,编译器自动填补“行”
int array3[2][] = {1,2,3,4,5,6}; //根据给出的初始化列表元素个数,编译器自动填补“列”
- 赋值方式
int array4[2][3]; //默认未被初始化(除非为全局数组),元素值未知
for(int i=0; i<2; i++) //行
for(int j=0; j<3; j++) //列
array4[i][j] = i*j+j;
- 部分初始化
int array5[2][3] = {{1,2,3}}; //理论上应该使用这种形式,一目了然,但是注意内部每个花括号的元素个数一定要等于列数;其它未给出值的数组元素默认初始化为0
int array5[2][3] = {1,2,3}; //此方式也可行;其它未给出值的数组元素默认初始化为0

三维数组与二维数组相似格式如下:数组名[a][b][c]
深入理解二三位数组:C/C++中,其实根本不存在二维数组这样一种数据类型,它其实是数组元素同样为数组的等效,因此我们可以把二维数组看成是数组的数组。
二维数组有多种创建方式,可根据不同的应用场景进行切换,还可以吧二三维数组当成一维数组用。
数组的优缺点
- 优点:顺序存储,快速访问
缺点:
需要时刻检查是否越界,一旦越界,整体程序有可能崩溃;
数组规模事先要确定,后续不可变化;
可能会浪费掉内存空间;
事先要清楚系统 平台所支持的最大栈数组,一般情况下不建议超过4MByte
字符数组与字符串处理函数
字符数组概述:字符型数据以ASCII码代码存储在存储单元中,一般占一个字节。由于ASCII代码也是雨整数行,因此可以把字符型归纳为整形类型中的一种。(在C语言中没有字符串类型,而C++中却有string类型可以定义字符串类型)
- 注意:在数组中 '\0’为字符串结束标志符系统自动添加
//字符串数组初始化举例
char c[10]={'I','a','m',' ','a','b','o','y'} //只初始化了前8个后两个没有初始化的全部设置为 '\0'
char diamond[5][5]={
{' ',' ','*'}, {' ','*',' ','*'},{ },{ },{ }
} //只初始化数组第一排第二排,只要有一个元素初始化,其他都会被默认初始化为 '\0'
// scanf 输入,printf 输出
//scanf 对字符类型有 %c 和 %s 两种格式(printf 同理,下同),其中 %c 用来
//输入单个字符,%s 用来输入一个字符串并存在字符数组里。%c 格式能识别 空格 跟 换行
//并将其输入,而 %s 通过 空格 或 换行 来识别一个字符串的结束。
//示例:
#include<stdio.h>
int main()
{
char s[10];
scanf("%s",str);
printf("%s",str);
return 0;
}
输入:TAT TAT TAT
输出:TAT
C/C++语言字符串处理函数
- puts()函数——输出字符串的函数
char str[]={"China\nBejing"};
puts(str);
输出//Chin a
//Bejing
- gets()函数——从键盘输入向字符中的输入函数
get(str);
从键盘输入: Computer
则 Computer被存入str中
- strcat(str1,str2)——字符串拼接函数//作用是将字符串str2,拼接并放入到str1数组中(但是前提是str1要足够能够装下str1和str2)
- strcpy(str1,str2)与strncpy(str1,str2,n)
注意strcpy() 是str2复制到str1(必须自己保证str1的空间可以装下str2).
而strncpy() 则是已经确定最多只能复制str2中n个字符到str1中。- strcmp(str1,str2)——字符串比较函数
根据ASCLL码比较大小,在比较时通过对应字母从前往后一个一个比较 只要有一个字符ASCLL码大的为大
如果str1=str2则函数返回值为0
如果str1>str2则函数返回值为正数
如果str1<str2则函数返回值为负值- strlwr(字符串)、strupr(字符串)分别把字符串转换为小写、大写
数组与指针
概述:数组与指针关系密切.数组名为地址可以用于给指针赋值,又可以通过 取地址运算符& 作用于数组元素,这样可以获取该元素的地址,用与指针赋值,而指针又可以通过 指针运算 去访问甚至是改变数组元素值。数组的元素又可以是指针
结构
- 结构存在的意义
- 定义结构并应用
- 定义结构数组并应用
结构存在的意义
在之前的学过的数据类型中,如 基本类型(int、double、char string)数组 共用体等均只能存储一种数据类型,结构体的存在可以同时存储多种数据类型。结构是用户定义的类型,所以要想使用它就必须第一步先定义这个 结构类型,第二步再通过这个结构类型去声明 一个结构变量(结构对象)。
定义结构并应用

#include<iostream>
using namespace std;
//使用结构第一步
//注意结构必须定义在main函数外边,在main函数内声明使用
struct jie_gou_ming
{
//里边可以包含各种数据类型
int a;
double b;
char c[10];
};
int main()
{
//声明结构变量 并进行列表{}初始化
jie_gou_ming bian_liang={
10,
3.9,
{"Hollow"}
};
//访问结构变量(通过'.'运算符来访问)成员并赋值
cout<<bian_liang.a<<endl;
bian_liang.a=100;
cout<<bian_liang.a<<endl;
cout<<bian_liang.c<<endl;
return 0;
}
//第二步声明结构变量并初始化
- 创建无名结构
#include <iostream>
using namespace std;
//创建无名结构并且直接声明(无名结构的)结构变量,并对她它进行初始化
struct
{
double a;
char ar[8]={"Good"};
} bian_liang={
10.9,
"boy"
};
int main()
{
cout<<bian_liang.ar; //结构成员的调用
return 0;
}
定义结构数组并应用
- 概述
结构数组指的是 可以用自己定义的结构类型去声明一个数组(这样做一次可以声明多个 结构变量),该数组的元素为 结构变量,所以该数组就叫 结构数组,数组中的每一个元素都可以访问它自己的成员。
- 声明结构数组
#include<iostream>
using namespace std;
struct inflatable //定义结构inflatable
{
char name[20];
float volume;
double price;
};
int main()
{
//声明结构数组并初始化结构数组(通过初始化列表)
inflatable guests[2]={
{"Bob",0.5,99},
{"xiao ming",1.5,100}
};
cout<<guests[0].name<<endl;//调用成员函数
cout<<guests[1].name<<endl;
//赋值
guests[1].price=666;//赋值修改
cout<<guests[1].price;
return 0;
}
结构与指针
概述:
结构与指针的关系有三方面
- 可以在结构定义中把指针作为成员函数
struct inflatable //定义结构inflatable
{
int * ptr; //结构成员为指针
};
- 可以把指针 定义为结构变量
#include<iostream>
using namespace std;
struct inflatable //定义结构inflatable
{
int * ptr;
};
int main()
{
inflatable *p;
p->ptr=NULL;
return 0;
}
- 可以使用 指针去(注意该指针的类型) 指向结构变量,从而访问结构的成员
#include<iostream>
using namespace std;
struct inflatable //定义结构inflatable
{
int * ptr;
};
int main()
{
inflatable *p;
inflatable Guest={
NULL
};
p=&Guest; //将指针指向Guest的地址
p->ptr;//用指针访问Guest的成员ptr;
return 0;
}
C/C++知识总结 五 复合数据类型 壹(数组、字符串与string、结构)的更多相关文章
- [日常] Go语言圣经--复合数据类型,数组习题
go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...
- js数据类型以及数组字符串常用方法
JS判断数据类型 例子: var a = "iamstring."; var b = 222; var c= [1,2,3]; var d = new Date(); var e ...
- ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套
这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- Python基础知识(五)
# -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春药# @Email : zhou_wanchun@qq.com# @Fi ...
- 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的五种数据类 ...
- redis五种数据类型的使用(zz)
redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...
- redis五种数据类型的使用
redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...
- [五]基础数据类型之Short详解
Short 基本数据类型short 的包装类 Short 类型的对象包含一个 short 类型的字段 原文地址:[五]基础数据类型之Short详解 属性简介 值为 215-1 ...
- IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列
1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...
随机推荐
- Yuchuan_Linux_C 编程之四动态库(共享库)制作
一.整体大纲 二.共享库的制作 1. 命名规则: lib + 名字 + .so 2. 制作步骤: 1) 生成与位置无关的代码 (生成与位置无关的.o) 2) 将.o打包成共享库(动态库) 3. ...
- EF6.0 下sql语句自动生成的参数类型decimal(18,2)修改
很多时候我们需要对插入到数据库的数据的精度做一个控制,例如sql server下保留6位小数使用numeric(10,6) .而到c#里对应的数据类型就是decimal ,但是使用EF6.0的crea ...
- 在vue中实现锚点定位功能
场景如下: 今天早上看到需求方新提的一个需求,这是一份网上答卷,点击题数要实现滚动到对应题目的位置: 注意点:每题题目的高度是不受控制的,你可以取到想跳转的index:(我再循环题目时做了index+ ...
- 从源码看 PHP 7 数组的实现
本文所用源码为 PHP 7.4.4 的版本. PHP 7 数组概述 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当 ...
- DOTNET CORE源码分析之ServiceDescriptor
ServiceDescriptor在.net core中的作用就是DI中注入服务元素的描述.每一个元素核心内容部分包括需要注入的服务元素的类型ServiceType,它对应的接口(如果有的话)Impl ...
- 手把手构建LSTM的向前传播(Building a LSTM step by step)
本篇是在之前两篇基础上接着写的: 吴恩达deepLearning.ai循环神经网络RNN学习笔记(理论篇) 从头构建循环神经网络RNN的向前传播(rnn in pure python) 也可以不看 ...
- [Visual Basic]冒泡排序及优化
冒泡排序 注意点 越界问题:i的边界是n-1,也就是说是对总共的第1~n个数进行排列(最后一个数处于被比较状态,不需要额外主动比较):j的初始值或最终值与当前i的值 有关题目中往往会改变i的值来考察, ...
- 物联网时代-新基建-ThingsBoard调试环境搭建
前言 2020开年之际,科比不幸离世.疫情当道.经济受到了严重的损失.人们都不幸的感慨: 2020年真是太不真实的一年,可以重新来过就好了!国家和政府出台了拯救经济和加速建设的利好消息.3月份最热的词 ...
- scrapy框架Request函数callback参数为什么是self.parse而不是self.parse( )
加括号是调用函数,不加括号是指的是函数地址,此处只需要传入函数的地址,等待程序到时调用即可
- 图数据库 Nebula Graph TTL 特性
导读 身处在现在这个大数据时代,我们处理的数据量需以 TB.PB, 甚至 EB 来计算,怎么处理庞大的数据集是从事数据库领域人员的共同问题.解决这个问题的核心在于,数据库中存储的数据是否都是有效的.有 ...
