3.1 一维数组
3.1.1 一维数组的建立与初始化
数组是一组相同类型元素的集合。
一维数组的创建形式:
元素类型+数组名+[一个常量表达式,用来指定数组的大小]。
Eg:
char arr1[10];
int count = 10;
int arr2[count];
数组初始化:
在创建数组的同时给数组的内容一些合理初始值(初始化)。
Eg: char arr1[]=′ABCD′
3.1.2 一维数组的使用
下标引用操作符:[ ]。它其实就数组访问的操作符。
#include <stdio.h>
int main()
{
int arr1[5] = { 1,2,3,4,5 };//下标引用:arr1[下标]
int a = sizeof(arr1) / sizeof(arr1[0]);
for (int i = 0; i < a; i++)
{
printf("%d",arr1[i]);
}
return 0;
}
注意:
1. 数组是使用下标来访问的,下标是从0开始。
2. 数组的大小可以通过计算得到。sizeof(arr1) / sizeof(arr1[0]);
3.1.3 一维数组在内存中的存储
#include <stdio.h>
int main()
{
int arr1[5] = { 1,2,3,4,5 };//下标引用:arr1[下标]
int a = sizeof(arr1) / sizeof(arr1[0]);
for (int i = 0; i < a; i++)
{
printf("&arr1[%d]=%p\n",i, &arr1[i]);
}
return 0;
}
注意:随着数组下标的增长,元素的地址,也在从地址向高地址有规律的递增。即:数组在内存中是连续存放的。
3.2 二维数组
3.2.1 二维数组的建立与初始化
二位数组就是将同一类型的数据通过行列式的形式进行存储。
二维数组的创建形式:
元素类型+数组名+[常量表达式,行的大小] [常量表达式,列的大小]。
Eg:
int arr[3][4];
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}};//二维数组如果有初始化,行可以省略,列不能省。三维数组第一维可以省略,后两维不能省略。
3.2.2 二维数组的使用
二维数组的使用也是通过下标的方式。
#include <stdio.h>
int main()
{
int arr[2][4] = { 1,2,3,4,8,7,6,5 };//1 2 3 4;8 7 6 5
int arr1[2][5] = { {1,2,3,4},{5,6,7,8} };//1 2 3 4 0;5 6 7 8 0
int a = sizeof(arr) / sizeof(arr[0]);//行数
int b = sizeof(arr[0]) / sizeof(arr[0][0]);//列数
int i = 0;
for (i = 0; i < a; i++)
{
int j = 0;
for (j = 0; j < b; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
3.2.3 二维数组在内存中的存储
二维数组在内存中的存储跟一维数组在内存中的存储是一样的(如:int arr[3][4]=int arr[12]),只是表现形式与引用形式不同。即:二维数组在内存中也是从低地址到高地址连续存放的。
3.3 数组的越界
数组的下标是有范围限制的。数组引用的下标超出了有限范围,就是数组越界访问了。C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的。
3.4数组作为函数参数
冒泡法排序:
//数组作为函数参数
//冒泡法,升序排列
#include <stdio.h>
void bubble_sort(int arr[], int a)//形参是数组的形式:接受数组=接受的是指针变量;
//或者写为形参是指针的形式:void bubble_sort(int *arr, int a)
{
int i = 0;
for (i = 0;i < a - 1; i++)
{
int j = 0;
for (j = 0; j < a - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int n = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = n;
}
}
}
}
int main()
{
int arr[10] = { 7,4,3,5,2,8,9,1,6,10 };
int a = sizeof(arr) / sizeof(arr[0]);//不能在子函数内部求数组个数,因为子函数接受的为指针变量
bubble_sort(arr,a);//传递数组名=传递数组首元素的地址
for (int i = 0; i < a; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
数组名:
数组名确实能表示首元素的地址
但是有2个例外:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
注意:二维数组的数组名也表示数组首元素的地址,但其表示的是第0行的地址
sizeof(arr) / sizeof(arr[0]);//行数,sizeof(arr)总数组的大小,sizeof(arr[0])=一行的大小
sizeof(arr[0]) / sizeof(arr[0][0]);//列数,sizeof(arr[0][0]),首元素的大小