[C语言]之数组的使用
目录
什么是数组?
数组是一组相同类型的元素的集合,
int arr[ ] = { }; 为一维数组 int arr[ ][ ] = { }; 为二维数组,当然也有三维数组,使用较少;
一: 一维数组
1.1 数组的创建
type_t arr_name [const_n];
//type是类型 arr 是 数组名 const是常量
//注:[ ] 在c99之前 里面必须是常量 c99之后 支持了变长数组的概念。
//如何正确的创建数组?
int arr1[10];
//代码2
int count = 10;
int arr2[count];这里[]内不是常量
//代码3
char arr3[10];
float arr4[1];
double arr5[20];
1.2 数组如何初始化?
int arr1[10] = {1,2,3};
//int 类型 arr1数组名 [10]数组有十个元素 {1,2,3}初始化有123,其余为0
int arr2[] = {1,2,3,4};
//int 类型 arr1数组名 [ ]数组元素未初始化 {1,2,3,4}初始化有1234,[]内此时被{}内的个数初始为4
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
1.3数组的使用
数组是通过下标来访问的,小标从0开始;
数组的大小可以通过计算得到;
#include <stdio.h>
int main()
{
int arr[10] = {0};//数组的不完全初始化
//计算数组的元素个数
int sz = sizeof(arr)/sizeof(arr[0]);
//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
int i = 0;//做下标
for(i=0; i<10; i++)
{
arr[i] = i;
}
//输出数组的内容
for(i=0; i<10; ++i)
{
printf("%d ", arr[i]);
}
return 0;
}
1.4 数组在内存中的存储
要查看如何存储可以看数组的地址

可以看出数组在内存中是连续存储的,由低地址到高地址;
二 : 二维数组
2.1 2维数组的创建和初始化
int arr[3][4];
char arr[3][5];
double arr[2][4];
//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};
//二维数组如果有初始化,行可以省略,列不能省略
2.2 2维数组的使用
//二维数组也是通过下标访问的
#include <stdio.h>
int main()
{
int arr[3][4] = {0};
int i = 0;
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<4; j++)
{
arr[i][j] = i*4+j;
}
}
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<4; j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}
2.3 2维数组在内存中的存储

通过结果我们可以分析到,其实二维数组在内存中也是连续存储的。
三. 数组的越界
数组是通过下标访问的,如果超过了下标就是越界访问。
如果数组有n个元素,下标就有n-1个,访问n时就已经越界。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以程序员写代码时,最好自己做越界的检查。
四. 数组作为函数参数
数组在使用时,单独的数组名,默认为首元素地址。
但有2种情况列外
**一种是sizeof(数组名)单独放数组名时是整个数组 这时数组名代表整个数组 。
**一种是 & 数组名 ,取出的是数组的地址 这时数组名代表整个数组。
五.接下来,我们使用数组完成冒泡排序!!
引用网络gif图展示过程

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.每趟从第一对相邻元素开始,对每一对相邻元素作同样的工作,直到最后一对。
3.针对所有的元素重复以上的步骤,除了已排序过的元素(每趟排序后的最后一个元素),直到没有任何一对数字需要比较。
代码展示
