C语言使用结构体,一维数组和函数(方法)模拟二维数组。

本文介绍了一种使用C语言实现动态二维数组的方法,通过结构体和函数封装,提供了初始化、赋值、获取值、打印和销毁等操作,展示了如何在内存中顺序存储二维数组并进行有效管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 无论几维数组,在内存中的存储都是顺序存储了,二维数组只是我们自己抽象的出来一个数据结构。

下面代码用到了结构体做为操作对象,函数作为方法自我定义了类二维数组的数据结构。

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
typedef struct {
	int totalnum;//二维数组元素个数
	int rows;//行
	int cols;//列
	int *data;//存放数据的一维数组
}Arr2D;
#define OVERFLOW -1
//初始化二维数组
void InitArr2D(Arr2D *obj,int rows, int cols, int totalnum,bool isinit/*是否初始化为0*/)
{
	assert(rows > 0 && cols > 0 && totalnum > 0);//
	assert(rows*cols == totalnum);//行列的乘积要等于总元素个数
	obj->data = malloc(sizeof(int)*totalnum);
	assert(obj->data != NULL);
	if(isinit)
		memset(obj->data, 0, sizeof(obj->data));

	obj->rows = rows;
	obj->cols = cols;
	obj->totalnum = totalnum;

}
//给二维数值赋值
void SetValueArr2D(Arr2D *obj, int rows, int cols, int val)
{
	assert(obj != NULL);
	int index = rows * obj->cols + cols;
	if (index < obj->totalnum)
		obj->data[index] = val;
	else
		printf("the index is overflow for your Arr2D!\n");
}
//获取指定二维数据的值
int GetValueArr2D(Arr2D *obj, int rows, int cols)
{
	assert(obj != NULL);
	int index = rows * obj->cols + cols;
	if (index < obj->totalnum)
	{
		return obj->data[index];
	}
	else
	{
		printf("the index is overflow for your Arr2D!\n");
		return OVERFLOW;
	}
}
//销毁创建的对象
void DestoryArr2D(Arr2D *obj)
{
	assert(obj != NULL);
	if (obj->data != NULL)
		free(obj->data);
	obj->data = NULL;
}
//打印对象
void PrintArr2D(Arr2D *obj)
{
	assert(obj != NULL);
	for (int i = 0; i < obj->rows; i++)
	{
		for (int j = 0; j < obj->cols; j++)
		{
			printf("%d ", GetValueArr2D(obj, i, j));
		}
		printf("\n");
	}
}
void main()
{
	Arr2D a1;
	InitArr2D(&a1, 3, 4, 12, true);
	int a = GetValueArr2D(&a1, 0, 0);

	//初始化定义出来的对象。测试用例
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
			SetValueArr2D(&a1, i, j, i + j);
	}
	//打印初始化后的对象。
	PrintArr2D(&a1);

	DestoryArr2D(&a1);


	system("pause");
	return ;
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值