文章目录
- 1.一维数组
- 2.二维数组
- 3.冒泡排序
- 4.一维函数的数组名
- 5.二维数组的数组名
1.一维数组
语法形式:type_t arr_name [const_n]
数组是一组相同类型元素的集合
type_t是指数组的元素类型
arr_name是指数组的名称
const_n是一个常量表达式,用来指定数组的大小
比如,int arr[2],char ch[3],doule do[3+4]
在C99标准之前,数组的大小必须是常量或者常量表达式
在C99之后,数组的大小可以是变量,
为了支持变长数组,int arr[n],这种数组是不能初始化的
但是在访问元素时,是可以这么表示的,arr[i]
数组的初始化,在创建数组的同时给予数组一些合理初始值
如果没有给予足够的数值,那么这叫不完全初始化,
剩余的元素默认初始化为0,比如,int arr[10]={4,5,6,7,8}
如果没有初始化元素,则数组会根据后面的元素个数确定前面的数组的个数
当访问单个元素时,可以这么表示,arr[3],这里的[]为下标引用操作符,
数组是使用下标来访问的,下标是从0开始的,所以这里访问的是数组的第4个数字。
计算一个数组中元素的个数,可以这么表示
arr[10] = { 1,2,3,4,5,6,7,8,9,10 }
sz = sizeof(arr) / sizeof(arr[0])
一维数组:随着数组下标的增长,元素的地址,也在有规律的递增
数组在内存中是连续存放的
#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}
2.二维数组
对于二维数组int array[M][N], 说明如下:
(1) M和N都必须为常数,
(2) M代表数组有M行,N代表每行中有N个元素
(3) 其中M可以省略,省略后必须给出初始化表达式,编译器从初始化结果中推断数组有多少行
(4)N一定不能省略,因为N省略了就不能确定一行有多少个元素,也不能确定数组有多少行
int arr[3][4]
二维数组其他的和一维没有区别
后面两个[]指的是3行4列
初始化:
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}
代表第一行1,2,3,4,第二行5,6,7,8,第三行9,10,11,12
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10 }
当数字不足时,自动补零
代表第一行1,2,3,4,第二行5,6,7,8,第三行9,10,0,0
int arr[3][4] = { {1,2},{3,4},{5,6} }
代表第一行1,2,0,0,第二行3,4,0,0,第三行5,6,0,0
二维数组初始化可以省略行,但不可以省略列
int arr[][4]={{1,2,3,4},{5,6}}
代表第一行1,2,3,4,第二行,5,6,0,0
二维数组的使用也是通过下标的方式,行和列都是从0开始的
可以吧二维数组理解为:一维数组的数组
arr[0][j]这个数组的数组名为arr[0]
arr[1][j]这个数组的数组名为arr[1]
arr[2][j]这个数组的数组名为arr[2]
二维数组在内存中也是连续存放的
3.冒泡排序
核心思想
两个相邻的元素进行比较
一趟冒泡排序让一个数据来到它最终应该出现的位置上
要求一个数组按升序排序,
需要用每个数字和后面的数字比较
直到最终的数字按升序排序
数组传参的时候,形参有2种写法:
(1)数组
(2)指针
形参是数组的形式
#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[] = { 6,3,5,9,4,1,7,8,2,0 };int sz = sizeof(arr) / sizeof(arr[0]);//0 1 2 3 4 5 6 7 8 9//冒泡排序的算法,对数组进行排序bubble_sort(arr,sz);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}
4.一维函数的数组名
数组名确实能表示首元素的地址
但是有2个例外:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
#include <stdio.h>
int main()
{int arr[10] = { 0 };printf("%p\n", arr);//arr就是首元素的地址printf("%p\n", arr+1);printf("-----------------\n");printf("%p\n", &arr[0]);//首元素的地址printf("%p\n", &arr[0]+1);printf("-----------------\n");printf("%p\n", &arr);//数组的地址,尽管打印出来的和上面的相同,//但是它是整个数组的地址,//下面打印的地址和上面的不同,//就是因为它跳过了整个数组直接从下一个数组的首元素的地址开始打印printf("%p\n", &arr+1);return 0;
}
5.二维数组的数组名
#include <stdio.h>
int main()
{int arr[3][4] = { 0 };printf("%d\n", sizeof(arr) / sizeof(arr[0]));//计算元素的行数printf("%d\n", sizeof(arr[0]) / sizeof(arr[0][0]));//计算元素的列数printf("%p\n", arr);//也计算的是首元素的地址,但是这里的首元素指的是arr[0]这一整行4个元素的地址
}