C++基础三:数组

一维数组

数组就是把相同数据类型的变量组合在一起而产生的数据集合,每个变量在内存中都有对应的存放地址,而数组就是从某个地址开始连续若个位置形成的元素集合

定义格式如下:
数据类型 数组名[数组大小]

注意:数组大小必须是整型常量,不可以是变量,常见定义方式举例如下:

数组名称[下标]

定义了长度为size的一维数组后,只能访问下标为0~size-1的元素

一维数组的初始化,需要给出逗号隔开的从第一个元素开始的若干个元素的初值,并用大括号括住,后面未被赋初值的元素将会由不同编译器内部实现的不同而被赋以不同的初值(可能是很大的随机数),而一般情况默认初值为0

如果数组一开始没有赋初值,数组中的每个元素都可能会是一个随机数,并不一定默认为0

因此,如果想要给整个数组都赋初值0,只需要把第一个元素赋为0,或者只用一个大括号来表示

int a[N]={0};

数组中每个元素都可以被赋值,被运算,可以被当作普通变量进行相同的操作

如果根据一些条件,可以不断让后一位的结果由前一位或前若干位计算得来,那么就把这种做法称为递推,递推可以分为顺推和逆推两种

冒泡排序

排序是指将一个无序序列按某个规则进行有序排列

冒泡排序的本质在于交换,即每次通过交换的方式把当前剩余元素的最大值移动到一端,而当剩余元素减少为0时,排序结束

一重循环1~n-1(<=),比较n-1趟

二重循环0~n-1-i(<=),每次都与下一个数比较,范围不得超过每次比较的最后一个数

二维数组

二维数组是一维数组的拓展,格式如下

数据类型 数组名[第一维大小][第二维大小];

常见定义方式举例如下:

二维数组中元素的访问和一维数组类似,只需要给出第一维和第二维的下标

数组名[下标1][下标2]

需要注意的是,对定义为int a[size][size2]的二维数组,其第一维的下标取值只能是0~(size1-1),其第二维的下标取值只能是0~(size2-1)

二维数组在定义时可以初始化,需要按第一维的顺序依次用大括号给出第二维初始化情况,然后将它们用逗号分隔,并用大括号全部括住,而在这些被赋初值的元素之外的部分将被默认赋值为0

注意:如果数组大小较大(10^6),则需要将其定义在main函数外,否则会导致程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小,而函数外部申请的全局变量来自静态存储区,允许申请的空间较大

多维数组和二维数组类似,只是把维度增加了若干维,其使用方法和二维数组基本无差别

memest——对数组中每一个元素赋相同的值

如果需要对数组中每一个元素赋以相同的值,例如对数组初始化为0或是其他的一些数

给数组中每一个元素赋相同的值有两种方法

memset函数,格式如下

memset(数组名,值,sizeof(数组名));

使用memset函数需要在程序开头添加string.h头文件,建议赋0或-1,因为memset使用的是按字节赋值,即对每个字节赋同样的值,这样组成int型的4个字节就会被赋成相同的值,而由于0的二进制补码为全0,-1的二进制补码为全1,不易出错

如果要赋其他数字,例如1,则使用fill函数

字符数组

1.字符串的初始化,格式如下

字符数组也可以通过直接赋值字符串来初始化(仅限于初始化,程序其他位置不允许直接赋值整个字符串)

格式如下

2.字符数组的输入输出

字符数组就是char数组,当维度是一维时可以当做字符串,当维度是二维时可以当作字符串数组,即若干字符串

字符数组的输入输出除了使用scanf外,还可以使用getchar或者gets,其输出除了使用printf外,还可以使用putchar或者puts

(一)scanf输入,printf输出

scanf对字符类型有%c和%s两种格式,其中%c用来输入单个字符,%s用来输入一个字符串并存在字符数组里

%c格式能够识别空格跟换行并将其输入,而%s通过空格或换行来识别一个字符串的结束

(二)getchar输入,putchar输出

getchar和putchar分别用来输入和输出单个字符

(三)gets输入,puts输出

gets用来输入一行字符串,并将其存放于一维数组

puts用来输出一行字符串,即将一维数组在界面上输出,并紧跟一个换行

注意:

gets识别换行符\n作为输入结束,因此scanf完一个整数后,如果要使用gets,需要先用getchar接收整数后的换行符,即吃掉回车

3.字符数组的存放方式

由于字符数组是由若干个char类型的元素组成,因此字符数组的每一位都是一个char字符

在一维字符数组(二维字符数组的第二维)的末尾都有一个空字符\0,以表示存放的字符串的结尾

注意:
(一)结束符\0的ASCII码为0,即空字符NULL,占用一个字符位,因此开字符数组的时候要记得字符数组的长度一定要比实际存储字符串的长度至少多1

(二)int型数组的末尾不需要加\0,只有char型数组需要,还需要注意\0和空格不是同一个东西,空格的ASCII值为32

(三)如果不是使用scanf函数的%s格式或gets函数输入字符串,例如使用getchar,一定要在输入的字符串后面加上\0,否则printf和puts输出字符串会因无法识别字符串末尾而输出一大堆乱码

string.h头文件

string.h头文件包含了许多用于字符数组的函数,使用以下函数时需要在程序开头添加string,h头文件

1.strlen()

strlen函数可以得到字符数组中第一个"\0"前的字符的个数,其格式如下

strlen(字符数组);

2.strcmp()

strcmp函数返回两个字符串大小的比较结果,比较原则是按字典序,格式如下

strcmp(字符数组1,字符数组2)

所谓字典序就是字符串在字典中的顺序,因此如果有两个字符数字str1和str2,且满足str1[0...k-1]==str2[0...k-1]、str1[k]<str2[k],那么就说str1的字典序小于str2

strcmp的返回结果如下
(一)如果字符数组1<字符数组2,则返回一个负整数(不同编译器处理不同,不一定是-1)

(二)如果字符数组1==字符数组2,则返回0

(三)如果字符数组1>字符数组2,则返回一个正整数(不同编译器处理不同,不一定是1)

3.strcpy()

strcpy函数可以把一个字符串复制给另一个字符串,格式如下

strcpy(字符数组1,字符数组2)

注意:

是把字符数组2复制给字符数组1,这里的"复制"包括了结束符\0

4.strcat()

strcat()可以把一个字符串接到另一个字符串后面,格式如下

strcat(字符数组1,字符数组2)

注意:
是把字符数组2接到字符数组1后面

sscanf和sprintf

sscanf和sprintf是处理字符串问题的利器(sscanf从单词上可以理解为string+scanf,sprintf从单词上可以理解为string+printf),两者均在stdio.h头文件下

scanf和printf的写法可以成下面的样子

sscanf和sprintf与上面的格式是相同的,只是把screen换成了字符数组,如下所示

sscanf是把字符数组str中的内容以%d的格式写到n中(从左至右)

sprintf是把n以%d的格式写到str字符数组中(从右至左

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>