一、 一维数组的创建和初始化
1、数组的创建
数组书写的格式:
数组类型 数组名[常量表达式];
如:
int arr[10];//创建一个数组,数组有10个元素,元素类型是int型。
char ch[5];// 创建一个数组,数组有5个元素,元素类型是char型。
2、数组的初始化
以上述int arr[10]为例:int arr[10] = {1,2,3,4,5,6,7,8,9,10};
只写一个int arr[10],是在内存中开辟一块可存放10个int型元素的空间,而初始化后是既开辟了空间又存放了这1-10的数字。
在C99之前,数组的初始化必须使用常量,不能使用变量,如:
这样写错的,不能使用变量来定义数组元素个数,但是C99之后支持了变长数组后就支持了,但是还是得看编译器是否支持C99标准。
数组的初始化可以省略元素个数,但是前提是{}内得有初始化的元素,如:int arr[] = {1,2,3,4,5};这样可以。但如果int arr[] = {};这样是绝对不行的。
数组也可以存放字符串,如:int arr[10] = “abcdfg”;[]内的常量也可以省略。
二、 一维数组的使用
使用数组元素需要借助一个操作符:[],这个叫下标引用操作符。如:输出数组中所有的元素。
注:数组下标是从0开始的。最后一个数组的下标是数组元素个数-1。数组元素个数的求法是:int sz = sizeof(arr)/siaeof(arr[0]);
特别注意:数组名一般情况下代表首元素的地址,但是有两个特殊情况:
(1)sizeof(数组名)这时的数组名代表的是整个数组。sizeof求出的是整个数组的大小。
(2)&(数组名)这时的数组名代表的也是整个数组,取地址,取出的是整个数组的地址。
所以sz就是利用sizeof求出整个数组的大小除去数组第一个元素的大小得出的就是数组元素的个数。
三、 一维数组在内存中的存储
数组在内存中是连续存储的,代码如下:
输出结果:
这里取出的是数组元素在内存中存放的地址,地址在内存中是按16进制存放的。这里可以看到,因为数组中元素的类型是int型,int型占4个字节。所以可以看到每两个元素之间的地址正好差4。所以我们得出数组在内存中是连续存储的,而且随着数组元素的增长,地址也是逐渐增长的。
四、 二维数组的创建和初始化
1、 二位数组的创建
与一维数组一样,也是要有数组类型、数组名和[]中的常量表达式。但是二维数组是有两个[][]的,因为在逻辑上,二维数组代表的是几行几列的。
就如:int arr[2][3];创建一个两行三列的数组。
2、 二维数组的初始化
如:int arr[3][4] = {0};
int arr[3][4] = {{0}, {0},{0}};
int arr[][3] = {{1,2,3},{4,5,6}};二维数组初始化的时候,行可以省略,但是列不能省略。因为这个{}中只有两个小括号,说明这个二维数组中有两行,每行有4个元素。
图片中可以看到,这个二维数组有两行,每行被初始化成我们规定的元素。
五、 二维数组的使用
与一维数组同理,都可以使用数组下标引用元素和循环把数组元素挨个输出。
因为,它是一个二维数组所以要用两层循环来循环输出。
六、二维数组在内存中的存储
二维数组在内存中是如何存储的呢?也是连续存储的嘛?我们用代码验证一下,代码如下:
我们发现二维数组的地址居然也是连续的。那为什么我们要把它想象成分层的呢?因为这是为了我们大家更简单的了解二维数组。但是实际上二维数组在内存中存储方式为:
每一大块代表一个一行,一行内又分有好几个元素,代表一列的元素。
七、 数组作为函数参数
将数组作为参数传递给函数,例如设计一个冒泡排序需要用函数写,代码如下:
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
int i = 0;//10个元素一共需要走9趟
for (i = 0; i < sz - 1; i++)
{
int j = 0;//每趟中要排序元素的个数
for (j = 0; j < sz - 1 - i; j++)
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,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]);
}
}
输出结果如下:
解释:
当数组传参的时候,实际上只是把数组的首元素的地址传递过去了,而通过这个数组首元素和数组元素个数可以推算出整个数组。所以在bubble_sort函数中操作的是这个arr数组。
第一步,初始化数组arr和计算数组元素个数sz,将数组名(数组首元素的地址)和数组元素传递给函数bubble_sort。
第二步,
这是第一趟,把9交换到了最后一位,第二趟的时候,就是把8交换到9的前面一位,9交换了9次,因为一共10个元素,把前9个元素的位置交换完成后,最后一个元素就会出现在它该出现的位置了。所以当第二趟交换8的时候,就只需要交换8次。
往后依次这样做,最后就会让整个数组按照0123456789这样排列。