文章目录
1. 一维数组
1.1 数组的创建
数组是一组相同类型元素的集合。数组的创建方式为:
type_t arr_name [const_n]
//type_t是指数组的元素类型
//const_n是常量表达式,用来指定数组大小
例如:
int arr1[10];
char arr2[20];
double arr3[20];
注意:数组创建,中括号[]中要给一个常量才可以,不能使用变量
1.2 数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理的初始值(初始化)。例如:
int arr1[10] = {1,2,3}; //不完全初始化,前三个元素为1,2,3,剩下的元素默认初始化为0
char arr2[5] = {'a','b'}; //不完全初始化,前两个元素为'a','b',剩下的元素默认初始化为0
char arr3[5] = 'ab'; //不完全初始化,前三个元素分别是a,b,\0,剩下的默认初始化为0
char arr4[] = 'abcdef'; //未指定常量,系统根据初始化元素的个数自动定义常量的值为7
1.3 一维数组的使用
-
数组是使用下标来访问的,下标从0开始
-
数组的大小可以通过计算得到,例如
int arr[] = {1,2,3,4,5,6} int sz = sizeof(arr) / sizeof(arr[0])
1.4 一维数组的内存存储
例如:
int main()
{
int n = 0;
int arr[8] = {1,2,3,4,5,6,7,8};
for (n = 0; n < 8; n++)
{
printf("arr[%d]=%p\n", n, &arr[n]);
}
return 0;
}
打印的结果为:
arr[0]=000000E293EFF7A8
arr[1]=000000E293EFF7AC
arr[2]=000000E293EFF7B0
arr[3]=000000E293EFF7B4
arr[4]=000000E293EFF7B8
arr[5]=000000E293EFF7BC
arr[6]=000000E293EFF7C0
arr[7]=000000E293EFF7C4
随着数组下标的增长,元素的地址,也在有规律的递增。由此可以得出结论:数组在内存中是连续存放的。
2. 二维数组
2.1 二维数组的创建
二维数组每一行其实就是一维数组,可以说是由一维数组组成的
int arr1[3][4];
char arr2[20][12];
double arr3[20][6];
2.2 二维数组的初始化
int arr[3][4] = {1,2,3,4,5}; //不完全初始化,第一行放1,2,3,4,放不下了5自动放到第二行
int arr[3][4] = {{1.2.3},{4,5}}}; //不完全初始化,第一行前三个元素为1,2,3,第四个元素为0;第二行前两个元素为4,5,其余的为0
int arr[][4] = {{1,2,3,4},{5,6,7,8}}; //第一行初始化为1,2,3,4;第二行初始化为5,6,7,8;因为没有指定数组的行,所以其根据初始化内容自动定义行数为2
注意:二维数组初始化时,可省略行,不能省略列
2.3 二维数组的内存存储
int main()
{
int i = 0;
int arr[3][4] = { {1,2,3,4},{5,6,7,8} };
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 4; j++)
{
printf("&arr[%d][%d]=%p\n", i,j, &arr[i]);
}
}
return 0;c
}
打印结果为:
&arr[0][0]=0000006AE02FF888
&arr[0][1]=0000006AE02FF888
&arr[0][2]=0000006AE02FF888
&arr[0][3]=0000006AE02FF888
&arr[1][0]=0000006AE02FF898
&arr[1][1]=0000006AE02FF898
&arr[1][2]=0000006AE02FF898
&arr[1][3]=0000006AE02FF898
&arr[2][0]=0000006AE02FF8A8
&arr[2][1]=0000006AE02FF8A8
&arr[2][2]=0000006AE02FF8A8
&arr[2][3]=0000006AE02FF8A8
因此:二维数组在内存中是连续存放的。
3.数组作为函数参数
往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序
void bubble_sort(int arr[], int sz)
{
//确定冒泡排序的趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1; //假设这一趟要排序的数据已经有序
int j = 0;
for (j = 0; j < sz - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0; //本趟排序的数据不完全有序
}
}
if (flag == 1)
{
break;
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
for (i = 0; i < sz; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
数组传参,传的是数组首元素的地址,通常情况下:数组名其实就是首元素地址但有两个例外:
- sizeof内部放数组名,数组名表示整个数组,此时sozeof(数组名)计算的是整个数组的大小,单位是字节
- &数组名,数组名表示整个数组。&数组名取出的是整个数组的地址