目的:学习数组
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
5.1 为什么需要数组
1.数组的定义:就是用一个统一的名字代表这批数据,而用序号或下标来区分各自的数据,可以理解为“数组是有序数据的集合”
补充:
a:用来表示该数据在数中的序号成为下标,下标只是表示有多少个元素,并且是从0开始的
b:数组中的数据称为数组元素
c:数组是有类型的,所以数组中的每一个元素都必须属于同一个数据类型
d:数组也是要先定义然后才能使用的
2.数组的好处:不需要定义大量的变量,大大减少程序中的变量数量,使程序精炼
注意⚠️:
a:在C语言和C++中,数组是要用方括号来表示下标的,“[ ]”下标引用操作符
b:只能逐个引用数组元素而不能一次引用整个数组的全部元素的值
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
5.2 定义和引用一堆数组
1.数组的一般形式:类型名 数组名[ 常量表达式]
a:常变量表达式:包括常量、长变量和符号常量,不可以是变量
b:常变量表达式的值表示元素的个数,即数组长度
2.数组元素的形式:数组名[下标]
a:下标可以是整型常量或者整型表达式
3.一堆数组的初始化
a:定义:在创建数组的同时给数组的内容一些合理的初始值
b:实现方法:
(1)在定义数组时对全部数组的元素赋予初值,例如:int a[3]={1,3,4}
(2)也可以只赋一部分的值,例如:int a[4]={1,3,4},剩下的那一部分就默认为0
(3)对全部数组赋初值时,可以不指定数组长度,例如:int a[]={1,3,4},并且系统会自动定义为长度5
d:这里补充一下一个可能会用来计算长度的一个小方法
int sz=sizeof(arr)/sizeof(arr[0])
c:数组是连续存放的
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
5.3 定义和引用二维数组
可以类比一下一维数组
1.二维数组一般的形式:类型名 数组名[ 常量表达式][常量表达式]
2. 二维数组的元素的一般形式为:数组名[下标][下标]
a:数组元素可以是左值,也可以出现在表达式中,也可以被赋值
b:第一个下标可以表示行,第二个可以表示列,列不可以省略,行可以
3.二维数组的初始化,与一维数组类似
a:按行给二维数组全部元素赋值,例如:int a[1][2]={{1},{2}};
b:可以将所有的数据写在一个花括号内,按照数组排列的顺序对全部元素赋初值,例如:
int a[1][2]={1,2}; ,系统及自动安排
c:可以对部分元素赋初值,没有被赋予初值的就默认为0
int a[2][2]={{1},{2}};
d:如果对全部都赋初值(即提供全部初始数据),则第1维数组长度可以不指定,但第2维数组的长度不能省略,例如:int a[2][2]={1,2,3,4}可以写成int a[][2]={1,2,3,4}
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
5.4 用数组做函数参数
1.用数组元素做函数实参:数组元素当然可以作为函数的实参,与用变量做实参一样,将元素的值传送给形参变量
2.用数组名做函数参数:形参和实参都可以,数组名带代表的是首元素地址
补充—数组名做函数参数的说明:
a:若函数实惨为数组名,形参也应为数组名,形参不能声明为普通变量(例如:可以声明为int arr[3],但不可以声明为int arr),且行参与实参的类型应一致
b:数组做参数时,也是单向传递,形参的改变不会影响实参
c:一些合理的写法:
void sort(int arr[10],int n);//个数与实参相同
void sort(int arr[],int n);//不写
void sort(int arr[5],int n);//与实参个数不同
补充—数组一些小变化:
a:数组不同情况所代表的内容不同
int arr[10];
cout<<arr<<endl;//代表的是首元素地址
cout<<&arr[0]<<endl;//代表的是首元素地址
cout<<&arr[2]<<endl;//代表的是下标为2的地址
cout<<&arr<<endl;//代表的是整个数组的地址
b:sizeof与数组
int arr[4];
sizeof(arr);//表示的是整个数组的大小、单位长度
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
5.5 字符数组(用来存放字符数据的数组)
1.初始化:有两种方法
a:方法一:直接逐个字符进行初始化,但是不会自动加‘\0’,若要加上‘\0’,那么他也要算其中的一个元素
int a[]={'a','b','\n'};//3个元素
int a[]={'a','b'};//2个元素
b:方法二:使用“ ”初始化数组,这个会自动加‘\0’
c:\0的作用是使程序结束,所以在程序中我们一般是以遇到‘\0’的位置来判断是否结束了,而不是数组的长度来决定的
2.字符数组的赋值与引用
a:只能对字符数组的元素赋值,而不能对整个赋值语句对整个数组赋值
例如:我们已经定义了a和b是具有相同类型和长度的数组,且b数组已经初始化了,我们打算把数组b的赋值给数组a
合理的写法是一个一个元素赋值:a[2]=b[2];
不合理的写法:a=b;
3.输入输出注意:
a:输出的字符不包括结束符'\0'
b:输出字符串时,cout流中用字符数组名;但如果是输出一个字符的话,就用数组元素名
c:如果数组长度大于字符串实际长度,与‘\0’结束
d:如果一个字符数组包含一个以上‘\0’,则遇到第一个‘\0’就输出结束
e:用cin输入要储存的一个字符串或字符时,应小于我们定义的数组长度,可以理解为有多少用多少,别用飚了
4.一些字符串处理函数
a:字符串连接函数strcat:strcat(char[ ],const char [ ])
意义:将第2个字符数组中的字符串连接到前面字符数组的字符串的后面,第2 个字符数组被声明为const以保证数组的内容不会再函数期间调用修改
#include <iostream>
using namespace std;
int main()
{
char st1[30]="I like eating ";
char st2[10]="apple";
cout<<strcat(st1,st2);
return 0;
}
结果:
b:字符串复制函数strcpy:strcpy(char [ ],const char [ ])
作用:是将第2个字符数组中的字符串复制到第1个字符数组中去,是将第1个字符数组中的相应字符覆盖
#include <iostream>
using namespace std;
int main()
{
char st1[30]="I like eating ";
char st2[10]="apple";
cout<<strcpy(st1,st2)<<'\n';
return 0;
}
结果:
c:字符串比较函数strcmp:strcmp(const char [ ],const chatr [ ])
作用:比较两个字符串,比较的结果由函数值带回,比较用的是ASCII码
d:字符串长度函数strlen:strlen(const char [ ])
作用:测试字符串长度,不包括‘\0’
5.不仅有字符数组,也有字符串数组,两者的区别为,前者一个空间一个字符,后者为一个空间为一个完整的字符串,字符串数组也没哟包含‘\0’
共同学习,欢迎指正!