什么是数组:数组是一组相同类型元素的集合。数组有什么用呐?以后遇到大量相同类型的元素,单个创建是很麻烦的,就可以用数组来解决。
一维数组
-
创建数组和初始化
数组中元素的类型 数组名字 数组中元素个数[ ]
[ ] 里边是常量或者常量的表达式,创建的时候也可以不填,让电脑自己数元素的个数。
这里有一个注意:c99之前没有[ ] 中不能写变量,c99之后数组的大小可以是变量了,为了支持b变长数组,这里可以通过修改n的大小来指定数组arr的大小。这里会有争议,有一部分编译器不支持变长数组,visual studio 2019就不支持。
int n = 0;
scanf("%d", &n);
int arr[n];
数组的初始化分4种
- {1,2,3,4}单个数字的初始化
- {’a','b','c','d'}单个字符的初始化
- “abcd”字符串的初始化
- 有规律元素的,通过for循环初始化
-
数组的结构
[ ] 这个符号叫下标引用操作符,有了这个符号编译器才能识别为数组。
数组的每一个元素在内存中是有序排列的,并且每一个元素对应一个地址
二维数组
-
创建和初始化
数组中元素的类型 数组名字 数组中行的元素个数[ ] 数组中列的元素个数[ ]
为了方便自己理解,这把二维数组的[ ][ ]理解成行和列,但实际二维数组同一维数组一样,在内存中是连续排列的,后文将会介绍。
大括号中用大括号来安排元素的行和列,未安排的位置,编译器会自己默认初始化为0元素
二维数组的结构
二维数组的行和列都同样是从0开始数的;
数组越界,数组与函数
-
越界
数组的下标从0开始,最后一个元素下标为n-1,访问数组时超过数组下标的访问就会访问到其他程序的内存部分,就叫越界。越界编译器也不一定会报错,但是程序是错误的。
-
数组与函数
数组在传参时写的是数组名,函数在接受参数时可以写成arr[ ],本质上传的是数组的首元素地址,所以也可以写成*arr,用一个指针变量来接收。
以冒泡排序(升序)的例子来说明数组传参
冒泡排序的思想:
1、对相邻两个元素比较后进行交换
2、对每个元素完成交换的趟数
//冒泡排序算法
void bubble_sort(int arr[], int sz)
{
for (int i = 0; i < sz -1; i++)
{
int temp = 0;
for (int j = 0; j <sz -1-i ; j++)
{
if (arr[j] > arr[j+1])
{
temp = arr[j+1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
int main()
{
int arr[] = {99,8,7,65,5,4,3,2,12,0};
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;
}
数组名的理解
一维数组名的理解
数组名表示数组中首元素的地址,有两个例外:sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。&(数组名),这是数组名表示整个数组,取出的是整个数组的地址。
二维数组名的理解
二维数组也是类比一维数组,同样数组名表示的是首元素的地址,只是在二维数组中首元素是第一行,同样有两个例外。