数组

1.数组是什么

  • 数组是

一组数 一组相同类型元素的集合

1.1 创建方式

type_t  arr_name [const_n]
//type 指的是数组的元素类型
//const_n 指的是一个常量表达式,用来指定数组的大小

1.2 数组的初始化

int main()
{
	//整数初始化
	int a = 0; \\ 初始化
	int arr1[5] = {1,2,3,4,5}; \\完全初始化  --> 等价于 arr[] = {1,2,3,4,5}
	int arr2[5] = {1,2}; \\不完全初始化 
	//字符初始化
	char arr5[5] = {'1', '2', '3'}; \\ 1 2 3 \0
	char arr6[] = {'1', '2', '3'};
	char arr7[5] = "123";
	char arr8[] = "123";
	return 0;
}

1.3 对于字符数组的不同写法的内存分配问题

char arr1[] = "bit";
\\ 内存中存放 b i t \0 从b开始,到\0停止 
char arr2[] = {'b', 'i', 't'};
\\内存中存放b i t 从b开始,直到遇到\0才停止

1.4 地址的打印 -- 十六进制的打印

int main()
{
	printf("%x\n", 0x12); 
	printf("%p\n", 0x12); //0000 0012  -->八位十六进制,1位十六进制表示4位2进制,8个即代表 8*4 =32 个,代表了内存中的地址
	return 0;
}

1.5 一维数组的存储

一维数组在内存中是连续存放的 随着数组下标的增长,地址是由低到高变化的

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int sz = 0;
	sz = sizeof(arr) / sizeof(arr[0]);
	for (i=0; i < sz; i++)
	{
		printf("arr[%d] : %p\n", i, &arr);
	}
	return 0;
}

2. 二维数组

2.1 二维数组的创建

二维数组的初始化时 行可以省略,列不可以省略

int main()
{
	int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};  // 三行四列的数组 --初始化
	int arr[3][4] = {{1, 2}, {3, 4}};
	int arr[][4] = {{2, 3}, {4, 5}};
	return 0;
}

2.2 二维数组的使用

int main()
{
	int arr[][4] = {{1,2},{3,4},{5,6}}
	int i = 0;
	int j = 0;
	for(i = 0; i < 3; i++)
	{
		for(j = 0; j <3; j++)
		{
			printf("%d", arr[i][j]);
		}
	}
	return 0;
}

==二维数组的在内存中的存储是连续的==

2.3 数组作为函数参数

除了以下两种情况外,数组名就是首元素地址

  1. sizeof(数组名) - 数组名表示整个数组 - 计算整个数组的大小单位一个字节
  2. &数组名 - 数组名表示整个数组 - 取出的是整个数组的地址
  • 实例 (冒泡排序)
void bubble_sort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz-1; i++)
	{
		int j = 0;
		int flag = 1;

		for(j = 0; j<sz-1-i;j++)
		{
			if(arr[i]<arr[i+1])
			{
				int tmp = arr[i];
				arr[i] = arr[i + 1];
				arr[i + 1] = tmp;
				flag = 0;
			}
		}
		if(flag == 1)
		{
			break;
		}
	}
}

int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int i = 0;
	int sz = 0;
	sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz); //数组名就是首元素地址
	return 0;
}