数组是一组相同类型元素的集合
一维数组的创建和初始化:
创建:
type_t arr_name[const_n];
//type_t 是数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小,不能使用变量
初始化:
数组的初始化是指,在创建数组的同时给数组一些合理初始值
int arr[5]={1,2,3,4,5};
int arr[5]={1,2,3}; //不完全初始化,剩下的默认初始化为0
char arr[5]={'a','b','c','d','e'};
char arr[5]="ab"; // a,b,\0,0,0
char arr[]="abcde";
数组在创建的时候如果想不给数组确定的大小就得初始化,数组的元素个数根据初始化的内容来确定,但是对于下面代码要区分,内存中如何分配
- char arr1[]=”abc“; (sizeof=4,strlen=3)
- char arr2[]={'a','b','c'}; (sizeof=3,strlen=随机值(不知道后面有没有数据,\0表示结束))
一维数组的使用:下标引用操作符 [ 0,1,2,3..........]
数组长度:
- strlen(arr) //长度确定
- sizeof(arr)/sizeof(arr[0]) //长度不确定
一维数组在内存中的存储:连续的地址空间
二维数组的创建和初始化
创建:
type_t arr_name[m][n];
//m行n列数组,二维数组的列n不能省略
初始化
int arr[3][4]={{1,2,3,4},{},{},{}};
//不完全触发,补零
二维数组在内存中的存储:连续的地址空间
数组作为函数参数:实际上传过去的是数组首元素的地址
冒泡排序:相邻两个比较,交换
n个数,走n-1趟
void bubble_sort(int* arr,int size)
{
//确定冒泡排序趟数
int i=0;
for(i=0;i<size-1;i++)
{
int flag = 1;//假设这一趟要排序的数据已经有序
//每一趟冒泡排序
int j = 0;
for (j=0;j<size-1-i;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;
}
}
}
数组名是首元素地址
(有两个例外):
- sizeof(数组名)——数组名表示整个数组——计算的是整个数组的大小(字节)
- &数组名——数组名表示整个数组——取出的是整个数组的地址(虽然输出的值和首地址一样,但所表示的含义不同,arr+1表示的第二个元素的地址,&arr+1表示的是这个数组的下一个地址)