本章学数组
一维数组
数组是什么?数组是一组相同类型的集合
一维数组的创建和初始化
#include <stdio.h>
int main()
{
int arr1[]={1,2,3,4,5,6,7,8,9,10}; //arr1表示数组中有10个元素
int arr2[10]; //arr2这种定义在vs2019会报警告,未引用的局部变量
int arr3[10]={0}; //arr3表示有10个元素,每个元素都是0
return 0;
}
数组在创建的时候不想确定确定数组的大小是,一定要初始化
#include <stdio.h>
int main()
{
int n=10;
int arr[n]={0};
return 0;
}
//这种初始化,在C99中可以使用,但是不建议
//好多编译器还不支持,比如vs2019就能编译过去
数组的[]叫做下标引用操作符,里面放常量,不能使用变量
一维数组的使用
给一维数组赋值,打印数组的每一个元素
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
//scanf("%d", &arr[i]);
arr[i] = i;
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//注意数组元素是从下标0开始的,到10-1结束
//数组大小是可以通过sizeof操作符计算的
//sizeof(arr)计算数组一共有多大字节
//sizeof(arr[0])计算数组一个有多大字节,相除得到数组元素个数
一维数组在内存中的存储
%p是把变量的地址用16进制打印出来
&:取地址操作符,取变量的地址
可以看到arr[0]和arr[1]的地址差值为4,相差为4个字节,后面都是相差为4个字节,可以推出一维数组的元素在内存中是连续存放的
从低地址向高地址存放
数组名是首元素的地址,可以用指针接受
二维数组
创建和初始化
#include <stdio.h>
int main()
{
int arr1[3][3] = { 0 }; //三行三列的数组
int arr2[][3] = { {1,2,3},{3,4,5},{5,6,7} }; //三行三列的数组 //行数可以省略
int arr3[3][5] = { 1,2,3,4,5,6,7,8,9,10 }; //先把行填满,在进行下一行,剩下的元素,默认是0
//int arr4[2][] = { {1,2,3},{4,5,6} }; 这种是错误的,不能省略列数
return 0;
}
二维数组的使用
#include <stdio.h>
int main()
{
int arr[3][5] = { 0 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
arr[i][j] = 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;
}
二维数组也是通过下标操作符访问的
二维数组在内存中的存放
可以看出二维数组在内存中也是连续排放的,第一行和第二行也是相差为4,紧接着排放的,跟一维数组一样,地址也是从低到高的
#include <stdio.h>
int main()
{
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = &arr[0][0];
int i = 0;
for (i = 0; i < 12; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
//可以用指针
数组作为函数参数
冒泡排序
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] < arr[j+1]) //如果第一个元素小于第二个,交换内容
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]); //数组的个数
bubble_sort(arr, sz); //传过去的数组是首元素的地址
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//给函数传参的数组,是数组的首元素地址
传地址会改变值
上面代码如果数组本身就是降序的话,还得排序,改进一下
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
int i = 0;
int flag = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] < arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
flag = 1;
}
}
if (flag == 0) //flag值没改变,就是数组已经排序好了
break;
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}