目录
1.一维数组
1.1数组的创建方式
{类型+数组名+元素个数}
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小
1.2 数组的初始化
在创建数组的同时给数组的内容一些合理初始值(初始化)
int arr[3]={1,2,3};——完全初识化
int arr1[10] = {1,2,3};——不完全初始化
int arr2[ ] = {1,2,3,4};——自动分配数组空间大小
注意以下不同数组在内存中的分配: int型数组自动补充0;char型数组自动补充\0
char arr1[ ] = "abc";——[b i t \0],strlen(arr1)=3
char arr2[3] = {'a','b','c'}; ——[b i t ],strlen(arr2)=随机值
1.3一维数组的使用
1. 数组是使用下标来访问的,下标是从0开始
2. 数组的大小可以通过计算得到
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
1.4一维数组在内存中的存储
1.一维数组在内存中连续存放
2.随着数组下标的增长,地址由低到高变化
2.二维数组
2.1二维数组的创建和初始化
初始化——创建的同时赋值
1.int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};——完全初始化
2. int arr1[3][4] = {1,2,3,4,5,6};——不完全初始化后面补0
3.int arr2[3][4] = { {1,2},{3,4},{4,5} };
4. int arr3[ ][4] = { {1,2},{3,4},{4,5} };
可以不定义行数,但必须定义列
2.2二维数组的使用
二维数组的使用也是通过下标的方式,以arr——3行4列为例
(下标) | 0 | 1 | 2 | 3 |
0 | 1 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 |
2 | 9 | 10 | 11 | 12 |
2.3二维数组在内存中的存储
二维数组在内存中也是连续存储的
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int arr1[3][4] = {1,2,3,4,5,6};//不完全初识化后面补0
int arr2[3][4] = { {1,2},{3,4},{4,5} };
int arr3[][4] = { {1,2},{3,4},{4,5} };
int i = 0;
int j = 0;
int* p = &arr[0][0];
for (i = 0; i < 12; i++)
{
printf("%d ", *p);
p++;
}
//二维数组在数组中的存储
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("&arr[%d][%d]=%p\n",i,j, &arr[i][j]);
}
printf("\n");
}
return 0;
}
3.数组作为函数参数(冒泡排序为例)
在写代码的时候,会将数组作为参数传个函数
void bubble_sort(int arr[],int x)
{
//确定躺数
int i = 0;
for (i = 0; i < x - 1; i++)
{
//一次冒泡排序的过程
int j = 0;
for (j = 0; j < x - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
//交换
int tmp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = tmp;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };
//排序为升序——冒泡排序
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
return 0;
}
优化
以上代码会重复不必要的比较,加flag进行判断,简化步骤
void bubble_sort(int arr[],int x)
{
//确定躺数
int i = 0;
for (i = 0; i < x - 1; i++)
{
//一次冒泡排序的过程
int j = 0;
int flag = 1;
for (j = 0; j < x - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
//交换
int tmp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = tmp;
flag = 0;
}
}
if (flag ==1)
{
break;
}
}
}
int main()
{
int arr[] = { 9,6,7,5,3,2,8,4,1 };
//排序为升序——冒泡排序
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
return 0;
}
4.数组名
数组名是首元素的地址,但是有两个例外情况:
1.sizeof(数组名)——数组名称代表整个数组——计算的是整个数组大小,单位是字节
2.&数组名——数组名表示数组——取出的是整个数组的地址
&arr——>&arr+1,差距40个字节,加了整个数组的地址
arr——>arr+1,差距4个字节,加了一个元素的地址