C语言笔记一维&二维数组

文章目录

一、一维数组的创建

C99标准前, 中必须要给常量或常量表达式
C99标准后,支持了变长数组,但是这种情况下只允许定义,不允许初始化
c 复制代码
// 1.C99标准前,[]中必须要给常量或常量表达式
int arr[10];
char arr1[5 + 3];
// 2.C99标准后,支持了变长数组,但是这种情况下只允许定义,不允许初始化
int n = 10;
int arr2[n];
return 0;

二、一维数组的初始化

注意:字符数组的两种初始化方式,注意做辨别
c 复制代码
// 1.部分初始化
int arr[5] = {1, 2, 3}; // 数组大小为5,数组中初始化为1 2 3 0 0
// 2.完全初始化
int arr1[5 + 3] = {1, 2, 3, 4, 5, 6, 7, 8}; // 数组大小为8
// 3.不指定数组大小,根据元素个数进行初始化
int arr2[] = {1, 2, 3, 4, 5}; // 数组大小为5
// 4.字符数组的两种初始化方式,注意做辨别
char arr3[] = {'a', 'b', 'c'}; // 数组大小为3
char arr4[] = "abc";           // 数组大小为4,含\0
// 注意,这两种初始化方式虽然得到的结果相同但是初始化的过程是不同的,注意区别!
char arr5[5] = {'a', 'b', 'c'}; // 数组大小为5 初始化数据为 a,b,c 未初始化部分编译器补2个\0
char arr6[5] = "abc";           // 数组大小为5 初始化数据为 a,b,c,\0 未初始化部分编译器补1个\0
return 0;

三、二维数组的创建和初始化

注意:二维数组行数可省略但列数不可以省略
c 复制代码
// 1.完全初始化
int arr[3][2] = {1, 2, 3, 4, 5, 6};
// 2.不完全初始化
int arr1[3][2] = {1, 2, 3, 4};
// 3.分组不完全初始化
int arr2[3][2] = {{1, 2}, {3}, {4, 5}};
// 4.注意:二维数组行数可省略但列数不可以省略
int arr3[][2] = {1, 2, 3}; // 自动生成arr[0]和arr[1]
return 0;

四、数组名做为函数参数

数组名做为形参传递时实际上传的是首元素的地址,所以若想求元素个数不能在自定义的函数中计算而是要用参数传递。

以冒泡排序为例:

c 复制代码
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 = 0;
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
c 复制代码
int arr[] = {5, 8, 7, 3, 15, 9, 10, 2};
int sz = sizeof(arr) / sizeof(arr[0]);
// 排升序
bubble_Sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
	printf("%d ", arr[i]);
}
数组名的理解--除了下面两个特例其余情况下一维数组名代表首元素的地址,二维数组是首行地址

两个特例:

①sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。

②&数组名,取出的是数组的地址。 &数组名,数组名表示整个数组

c 复制代码
int arr1[] = {5, 6, 7, 8, 9};
printf("%p\n", arr1);     // 0000003f5abff850
printf("%p\n", arr1 + 1); // 0000003f5abff854
printf("----------------\n");
printf("%p\n", &(arr1[0]));     // 0000003f5abff850
printf("%p\n", &(arr1[0]) + 1); // 0000003f5abff854
printf("----------------\n");
printf("%p\n", &arr1);     // 0000003f5abff850
printf("%p\n", &arr1 + 1); // 0000003f5abff864 即加的是整个数组元素大小20字节 0x16换为10进制是20
c 复制代码
int arr2[2][3] = {5, 6, 7, 8, 9};
printf("%p\n", arr2);     // 0000005ec65ffc90
printf("%p\n", arr2 + 1); // 0000005ec65ffc9c 一行3个元素,12字节
printf("----------------\n");
printf("%p\n", &(arr2[0]));     // 0000005ec65ffc90
printf("%p\n", &(arr2[0]) + 1); // 0000005ec65ffc9c
printf("----------------\n");
printf("%p\n", &arr2);     // 0000005ec65ffc90
printf("%p\n", &arr2 + 1); // 0000005ec65ffca8  即加的是整个数组元素大小24字节
相关推荐
Dovis(誓平步青云)4 小时前
《QT学习第四篇:常见事件与UDP、TCP、文件系统、(锁、信号量、条件变量》
c语言·开发语言·汇编·qt
東雪木13 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
Oll Correct14 小时前
实验二十九:TCP的运输连接管理
网络·笔记
飞翔中文网15 小时前
Java学习笔记之抽象类与接口(设计思想)
java·笔记·学习
智者知已应修善业16 小时前
【proteus设计文氏正弦波信号发生器】2023-5-9
驱动开发·经验分享·笔记·硬件架构·proteus·硬件工程
凉、介17 小时前
深入理解 ARMv8-A|处理器模式与寄存器
笔记·学习·嵌入式·arm
.千余18 小时前
【C++】C++类与对象2:C++构造函数、运算符重载与流输入输出全面解析
c语言·开发语言·前端·c++·经验分享
whyTeaFo18 小时前
MIT 6.1810: Lec 5: calling conventions and stack frames RISC-V
笔记
上课不要睡觉了19 小时前
【统计法规】4.1统计管理体制概述
笔记·统计师考试
墨白曦煜19 小时前
算法实战笔记:剥开回溯算法的外衣——从通用模板到高阶去重(八)
笔记·算法