二位数组详解以及二维数组的传递

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//不管是几维数组,数组名都表示指向数组首元素地址的指针(数组首元素是什么类型,指针就是什么类型)   *******重点**********
void test01()
{
	int arr[3][3] = {
			{11,22,33},
			{44,55,66},
			{77,88,99}
	};
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d  ", arr[i][j]);
		}
		printf("\n----------------------------------------------------\n");
	}
}
void test02()
{
	//二位数组名表示指向数组首元素的指针 int(*)[3]
	int arr[3][3] = {
			{ 11, 22, 33 },
			{ 44, 55, 66 },
			{ 77, 88, 99 }
	};

	int num1 = (int)arr;
	int num2 = (int)(arr + 1);
	printf("arr+1  到 arr  步长为%d  \n", num2 - num1);//步长12

	int num3 = (int)&arr;
	int num4 = (int)(&arr + 1);
	printf("&arr+1  到 &arr  步长为%d  \n", num4 - num3);//步长36

	int(*p)[3] = arr;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d  ", (*p)[j]);//此处p是指向一维数组的指针 *p取出数组首地址加上下标取出一维数组内的数据
		}
		p++;//步长为12个字节
		printf("\n");


		//数组下标和指针表示方式
		printf("%d  \n", *(*(arr + 1)+1));//arr[1][1];
		printf("%d  \n", (*(arr + 1))[1]);  //arr[1][1];
	}
}
//不管是几维数组,数组名都表示指向数组首元素地址的指针(数组首元素是什么类型,指针就是什么类型)

void fun1(int *arr){}
void fun2(int(*p)[3]){}
void fun3(int arr[3][3]){}
void fun4(int arr[][3]){}

void test03()
{

	int my_arr[] = { 1, 2, 3, 4, 5 };
	fun1(my_arr);

	int arr[3][3] = {
			{ 11, 22, 33 },
			{ 44, 55, 66 },
			{ 77, 88, 99 }
	};

	fun2(arr);
	fun3(arr);
	fun4(arr);
}

void fun5(int ***arr)
{
	if (arr == NULL)
	{
		return;
	}
	int **temp = *arr;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d ", *(*(temp + i) + j));

			temp[i][j] = 100;
		}
		printf("\n");
	}

}
void test04()//二级指针动态分配内存,用三级指针接,并改变数据
{
	int **arr = (int **)malloc(sizeof(int *) * 3);
	if (arr == NULL)
	{
		return;
	}
	memset(arr, 0, sizeof(int *) * 3);
	for (int i = 0; i < 3; i++)
	{
		arr[i] = (int *)malloc(sizeof(int) * 3);
		if (arr[i] == NULL)
		{
			goto End;
		}
		memset(arr[i], 0, sizeof(int) * 3);
	}
	int a = 1;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			arr[i][j] = a++;
		}
	}
	fun5(&arr);
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d    ", arr[i][j]);
		}
		printf("\n");
	}
	

End:
	for (int i = 0; i < 3; i++)
	{
		if (arr[i] != NULL)
		{
			free(arr[i]);
			arr[i] = NULL;
		}
	}
	free(arr);
	arr = NULL;

}
void main()
{
	//test01();
	//test02();
	//test03();
	test04();

	system("pause");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值