C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。在C语言中熟练的运用数组能够很好的帮助我们解决问题,今天我们就来一起了解一下吧。
一,数组的简介
数组其是就相当于在内存中取一段空间,来存放同一个类型的若干个数据,而且数组取的内存空间是连续的,无论是一维数组还是二维数组,二维数组可以理解为若干个一维数组组成的。
一维数组的存储
二维数组存储
因为一个int类型的数占4个字节,由此可以得出结论,无论是一维数组还是多维数组,其在存储的时候都是连续的
二,一维数组
1,一维数组的定义和初始化
要想把数据放入内存,必须先要分配内存空间。例如:放入 4 个整数,就得分配 4 个 int 类型的内存空间:
整形数组
int a[4] = {1,2,3,4}; //数组长度为4,只能存放4个元素
浮点数数组
float a[4] = {1.0,2.0,3.0,4.0}; //数组长度为4,只能存放4个元素
浮点数数组
double a[4] = {1.0,2.0,3.0,4.0}; //数组长度为4,只能存放4个元素
字符串
char a[4] = "123"; //数组长度为4,只能存放4个元素,这里默认加了 “\0 ”,所以在定义数组的时候要比存放的元素的个数大,否则会报错
当你给数组里的所有元素都进行了初始化时数组的大小可以省略如上图
字符数组有一个需要特别注意的点,就是在存储它的时候要特别注意它末尾的结束符 “ \0 ”,它是需要数组空间给它分配一个位置的,只是我们看不见,但你可以通过按F1来监视它,同时它也作为打印字符元素时的判断标志。如上图
以下是数组初始化的一些其他情况
A.在定义数组的同时赋值
//整形数组
int a[4] = {1,2,3,4}; //数组长度为4,只能存放4个元素
//浮点数数组
float a[4] = {1.0,2.0,3.0,4.0}; //数组长度为4,只能存放4个元素
//浮点数数组
double a[4] = {1.0,2.0,3.0,4.0}; //数组长度为4,只能存放4个元素
//字符串
char a[4] = "1234"; //数组长度为4,只能存放4个元素
B.根据数组下标对数组元素赋值
a[4];
a[0]=20;
a[1]=345;
a[2]=700;
a[3]=22;
等价:
a[4] = {20,345,700,22}
C.只给部分元素赋初值,当{ }中值的个数少于元素个数时,只给前面部分元素赋值,后面的元素默认为0值。例如:
//案例一
int a[10]={12, 19, 22 , 993, 344};
等价:
int a[10]={12, 19, 22 , 993, 344, 0, 0, 0, 0, 0};
//案例二
int a[10]={1};
等价:
int a[10]={1, 0, 0 , 0, 0, 0, 0, 0, 0, 0};
表示只给 a[0]~a[4]这 5个元素赋值,而后面5个元素默认为0值。当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0:
对于short、int、long,就是整数0;
对于char,就是字符 '\0';
对于float、double,就是小数0.0。
D.将数组的所有元素初始化为0,例如:
int a[10]={0};
等价:
int a[10]={0, 0, 0 , 0, 0, 0, 0, 0, 0, 0};
注意:
int a[10]={1};
等价:
int a[10]={1, 0, 0 , 0, 0, 0, 0, 0, 0, 0};
//如果希望数组中元素全部为1
int a[10]={1, 1, 1 , 1, 1, 1, 1, 1, 1, 1};
2,一维数组的访问
要注意的是,数组是从下标0开始访问的,arr[0]代表的是数组的第一个元素,以此往后类推比如说arr[0],表示访问数组的第一个元素,arr[2]表示访问数组的第三个元素,当然还有for循环遍历的访问方法,以及一些其它的方法,这里就不在叙述了如下图,用for循环对一维数组进行访问。
三,二维数组
1,二维数组的定义和初始化
arr[4][5]
代表这个数组是4行5列的,左边代表行右边代表列,表示从内存中取出一个4行5列的空间,作为一个数组
A 完全初始化
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}
B 部分初始化,没有初始化的元素会默认为0
int arr2[3][5] = { 1,2 };//完全初始化,剩余的元素默认初始化为0
int arr3[3][5] = { 1,2,3,4,5,6,7 };
C 对每行进行部分初始化,没有初始化的元素默认为0
int arr4[3][5] = { {1,2},{3,4,5 }, { 6,7 }};
2,二维数组的访问
二维数组在单独访问时和一维数组类似,通过下标进行访问,如arr[0][3]表示访问数组的第1行第3列的元素
要对数组的的每个元素都进行访问的话,则需采用for循环嵌套的方式进行访问如下图
int main()
{
int arr[3][5] = { 0 };
//输入
int i = 0;
for (i = 2; i >=0; i--)
{
int j = 0;
for (j = 0; j < 5; j++)
{
scanf("%d", &arr[i][j]);
}
}
//输出
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
这里是从第三行往第一行进行输入,然后再从第一行往第三行进行打印
四,数组练习
①数组的隐藏替换
QQ录屏20240131175510
一个有序的数组中查找指定的数,是否存在,存在则打印下标,不存在则说明不存在
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);//7
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
if (arr[i] == k)
{
printf("找到了,下标是:%d\n", i);
break;
}
}
if (i == sz)
printf("找不到了\n");
return 0;
}
sizeof(arr)求的是数组的大小,sizeof( arr[0] )求的是单个元素的大小
所以数组内的元素个数是 int sz = sizeof(arr) / sizeof(arr[0]); //10
③行列式的转置
图1
图2
这两个图都是行列式的转置但不同的是一个定义了行列式的大小,并进行了初始化,一个没有初始化,图一进行了初始化,在转置时可能会涉及到数组越界,所以多了一步b[j][i] = a[i][j],实现数组大小的改变。
④行列式的逆序输出
输入数组元素,再按从大到小的顺序输出即可
⑤交换两个数组中的元素
实现元素交换的方法就类似于交换两个杯子中的饮料,需要第三个杯子做一个衔接,很多时候需要用到这个方法
⑥实现数组的合并并按照从小到大的输出
#include <stdio.h>
int main()
{
int a,b,c[100],temp;
scanf("%d",&a);
scanf("%d",&b);
for(int i=1;i<=a+b;i++){
scanf("%d",&c[i]);
}
for (int i = 1; i <= a+b; i++)
{
for (int j = 1; j <= a+b - i; j++)
{
if (c[j] > c[j + 1])
{
temp = c[j];
c[j] = c[j + 1];
c[j + 1] = temp;
}
}
}
for(int i=1;i<a+b+1;i++){
printf("%d ",c[i]);
}
return 0;
}
这题就是不断地交换两个杯子中的元素,只要交换的次数足够多就一定能够实现从小到大的排序
数组在我们编程中的运用是非常广泛的,也是很重要的一个知识点,希望我们之后能够熟练的去运用数组去帮助我们解决问题
本次的文章就讲到这里,我们下次再见