为什么要有数组,当我们在c代码中要处理1000个学生成绩的时候,比如筛选出1000个学生中成绩在60到80分之间的人出来,这时候我们不仅需要维护1000个变量(这就很容出错了)还需要一个一个的判断工作量极大。这时候数组就可以完美的帮助我们处理好这件事情,我们只需要创建一个1000个元素的数组,然后使用循环遍历每个元素判断就好了。
那么我们来了解一下数组吧!!!
文章目录
数组
数组就是同种类型元素的集合
一维数组
1.一维数组的创建
//例如
int arr[10];
int arr[]={1,2,3,4,5,6,7,8,9};
如果我们要指定大小,那么数组名后面的方框内必须是常量(c99中的变长数组可以不是,,我们后面介绍哦)
2.一维数组的初始化
int arr[3]={1,2,3};
//字符数组也有两种初始化方式在这一其介绍
char a[12]="hello world"
char a[4]={'a','s','b'};
//当然字符数组也可以不指定大小
//但是自己制定大小的时候不要忘记字符串的结尾标识符 \0
int arr[10]={0};
//这里我们只是初始化了第一个元素,但是
//数组其他没有初始化的元素默认初始化为0
3.一维数组的使用
数组的使用就是下标了,这里只需要注意数组下标是从0开始就可以了
4.一维数组在内存中的储存
二维数组
关于二维数组可以理解为类似棋盘状的一个一个小格子,每个格子存放一个元素。
还可以理解为,二维数组就是一个个一维数组排列组成的
这样三维数组数组我们也就很好理解了,就是一个个二维数组排列组成的,空间中呈现立体的形状,关于三维数组可以自行查阅资料。
1.二维数组的创建
int arr[3][3];
int brr[][3]={1,1,2,5,6,4};
//注意二维数组创建时可以省略行,编译器根据初始化的元素来给数组分配行
//但是列不可以省略,省略之后编译器不知道一行初始化几个元素就会出问题
2.二维数组的初始化
int arr[3][3]={{1,2},{2,3},{4}};
//这里每一行元素都没有完全初始化,未初始化的元素默认初始化为0;
//这里可以将每一行看作是一维数组
3.二维数组的使用
#include<stdio.h>
int main()
{
int arr[3][3]={1,2,3,4,5,6,7,8,9};
int j=0;
int i=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",arr[i][j]);
}
}
}
行下标和列下标都是从0开始
4.二维数组在内存中的存储
这里有些许不同我们要重点记住,二维数组在内存中并不是跟想象的一样是棋盘状的,他在内存中其实与一维数组是一样的是连续存储的而其长度就是行和列的乘积。
关于变长数组
int n=0;
scanf("%d",&n);
int arr[n];
这里我们就可以根据所需输入数字来开辟数组的大小
使用变长数组要注意变长数组不可以初始化,因为数组的初始化是在编译的时候开辟空间然后将初始化值放进去的。变长数组是在程序运行起来之后根据输入的值开辟的大小,所以不可以在没开辟数组空间的时候储存初始化值。
数组越界
数组越界通常是使用的下标超出了数组的下标范围。通常堆溢出也可能是数组越界导致的。编译器有时候并不会提醒我们数组越界了,这时候就需要我们在使用的时候小心慎重。
数组作为函数参数
数组练习(冒泡排序)
#include<stdio.h>
int main(
{
int i=0;
int j=0;
int arr[10]={9,8,7,6,5,4,3,2,1,0};
//冒泡排序每次将数组相邻两两个元素比较,大的放在后面
//每一趟都会将数组中最大的元素冒泡到数组最后
//所以每走完一趟就会少一次比较
for(i=0;i<10-1;i++)
{
for(j=0;j<10-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
return 0;
}