二维数组,数组作为函数参数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//int main()
//{	
//	//创建
//	int arr[3][4];//二维数组,三行四列
//	char ch[3][10];
//	double  arr[2][4];
//	//初始化-创建的同时赋值
//	int arr[3][4] = { 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,11,12} };
//	int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化-整形补0,字符补\0
//	int arr[3][4] = { {1,2},{3,4},{4,5} };//不完全初始化
//	int arr[][4] = { {1,2},{3,4},{4,5} };//二维数组初始化行可以省略,列不可以省略
//	return 0;
//}

//int main()
//{
//	int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 4; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}

二维数组在内存中的存储
//int main()
//{
//	int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 4; j++)
//		{
//			printf("&arr[%d][%d]=%p\n",i,j, &arr[i][j]);
//		}
//	
//		// 二维数组在内存中也是连续存放的
//		// 一行内部连续,换行也是连续的
//		//	& arr[0][0] = 004FFC6C
//		//	& arr[0][1] = 004FFC70
//		//	& arr[0][2] = 004FFC74
//		//	& arr[0][3] = 004FFC78
//		//	& arr[1][0] = 004FFC7C
//		//	& arr[1][1] = 004FFC80
//		//	& arr[1][2] = 004FFC84
//		//	& arr[1][3] = 004FFC88
//		//	& arr[2][0] = 004FFC8C
//		//	& arr[2][1] = 004FFC90
//		//	& arr[2][2] = 004FFC94
//		//	& arr[2][3] = 004FFC98
//		
//	}
//	return 0;
//}

//为什么二维数组列数不能省略?
//因为内存布局情况,连续存放

//int main()
//{
//
//	int arr[][4] = { {1,2},{3,4},{4,5} };
//	int i = 0;
//	int j = 0;
//	int*p=&arr[0][0];
//	//指针变量*怕,指针的p是存储的指向的地址,p++就是指向p的下一个地址,带上*是可以操作修改这个地址里面的内容
//	for (i = 0; i < 12; i++)
//	{
//		printf("%d ", *p);
//		p++;
//	}
//	return 0;
//}

//void bubble_sort(int arr[])//形参arr本质上是指针
//{
//	//计算数组元素个数
//	int sz = sizeof(arr) / sizeof(arr[0]);//err,此时sz=1
//	//数组传参的时候,传递的其实只是数组首元素的地址
//	
//	//确定趟数
//	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 + 1];
//				arr[j+1] = arr[j];
//				arr[j] =tmp;
//
//			}
//		}
//	}
//}
//
//int main()
//{
//	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//	//排序为升序-冒泡排序
//	//冒泡排序的思想
//	//两两相邻的元素进行比较,并且可能的话需要交换
//	//一趟冒泡排序搞定一个元素
//	//n个数字  n-1趟冒泡排序
//	
//	
//	bubble_sort(arr);
//
//	return 0;
//}

//void bubble_sort(int arr[], int sz)//形参arr本质上是指针
//{
//	
//	//确定趟数
//	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 + 1];
//				arr[j + 1] = arr[j];
//				arr[j] = tmp;
//
//			}
//		}
//	}
//}
//
//int main()
//{
//	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//	//计算数组元素个数
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr,sz);
//	int k = 0;
//	for (k = 0; k < 10; k++)
//		printf("%d ", arr[k]);
//	return 0;
//}

数组名是什么?
数组名是数组首元素的地址
但是有两个例外
1.sizeof(数组名)-数组名表示整个数组-计算的是整个数组的大小单位是字节
2.&数组名-数组名表示整个数组-取出的是整个数组的地址
//
//int main()
//{
//	int arr[10] = { 0 };
//	
//	int sz = sizeof(arr); //数组名表示整个数组
//	printf("%d\n", sz);
//
//	printf("%p\n", &arr);//&arr取出的是数组的地址
//	printf("%p\n", &arr+1);
//
//	printf("%p\n", arr);
//	printf("%p\n", arr+1);
//	printf("%p\n", &arr[0]);
//
//	printf("%p\n", &arr[0]);
//	printf("%p\n", arr);//数组名是数组首元素的地址
//	return 0;
//}

对于接近有序的数组
优化
//
//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[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[] = { 1,2,3,4,5,6,7,8,9 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	return 0;
//}

数组作为函数传参的时候
形参可以写成2种形式
1.数组形式
2.指针形式
//
//int arr[10];
//
//test1(arr);
//
//形参数组形式
void test1( int arr[10])
{}
void test1(int arr[])
{}
//
形参是指针的形式
//void test1(int *arr)
//{}

//char ch[3][5];
//test2(ch);//调用
//
//形参是数组
void test2(char arr[2][5])
{}
void test2(char arr[][5])
{}
//
形参也可以是指针
暂时不考虑

posted @   morphism  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示