常量和所需的头文件
#include<stdio.h>
#include<stdarg.h>
#include<stdlib.h>
#define MAX_ARRAY_DIM 8 //设置数组维数最大为8
#define ElemType int
#define ERROR -1
#define SUCCESS 1
#define OVERFLOW -2
#define UNDERFLOW -3
结构体
typedef struct {
ElemType* base;//数组元素基址,由InitArray分配
int dim;//数组维数
int* bounds;//数组维界基址,由InitArray分配
int* constants;//数组映像函数常量基址,由InitArray分配
}Array;
构造数组A
Array InitArray(Array A, int dim, ...) {
//若维数dim和各维长度合法,则构造相应的数组A
if (dim<1 || dim>MAX_ARRAY_DIM)
{
exit(ERROR);
}
A.dim = dim;
A.bounds = (int*)malloc(dim * sizeof(int));
if (!A.bounds)
{
exit(OVERFLOW);
}
//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
int elemtotal = 1;
va_list ap;
va_start(ap, dim);
for (int i = 0; i < dim; i++)
{
A.bounds[i] = va_arg(ap, int);
if (A.bounds[i] < 0)
{
exit(UNDERFLOW);
}
elemtotal *= A.bounds[i];
}
va_end(ap);
A.base = (ElemType*)malloc(elemtotal * sizeof(ElemType));
if (!A.base)
{
exit(OVERFLOW);
}
//求映像函数的常数ci,并存入A.constants[i-1],i=1,...,dim
A.constants = (int*)malloc(elemtotal * sizeof(ElemType));
if (!A.base)
{
exit(OVERFLOW);
}
A.constants[dim - 1] = 1;//L=1,指针的增减以元素的大小为单位
for (int i = dim - 2; i >= 0; i--)
{
A.constants[i] = A.bounds[i + 1] * A.constants[i + 1];
}
return A;
}
销毁释放数组
Array DestoryArray(Array A) {
if (!A.base)
{
exit(ERROR);
}
free(A.base);
A.base = NULL;
if (!A.bounds)
{
exit(ERROR);
}
free(A.bounds);
A.bounds = NULL;
if (!A.constants)
{
exit(ERROR);
}
free(A.bounds);
A.bounds = NULL;
return A;
}
求出元素在数组中的相对地址
int Locate(Array A, va_list ap, int off) {
//若ap指示的各下标值合法,则求出该元素在A中相对地址off
for (int i = 0; i < A.dim; i++)
{
int ind = va_arg(ap, int);
if (ind < 0 || ind >= A.bounds[i]) {
exit(OVERFLOW);
}
off += A.constants[i] + ind;
}
return off;
}

获取A相应位置值函数

int Value(Array A, ElemType e, ...) {
//A是N维数组,e为元素变量,随后是n个下标值
//若下标不超界,则e赋值为所指定的A的元素值
va_list ap;
int off = 0;
va_start(ap, e);
if ((Locate(A, ap, off)) <= 0)
{
exit(ERROR);
}
e = *(A.base + off);
return e;
}
为A指定位置赋值函数
Array Assign(Array A, ElemType e, ...) {
//A是n维数组,e是元素变量,随后是n个下标值
//若下标不超界,则将e值赋给所指定的A的元素
va_list ap;
int off = 0;
va_start(ap, e);
if (Locate(A, ap, off) <= 0)
{
exit(ERROR);
}
*(A.base + off) = e;
return A;
}
main函数调用
int main(void) {
int off = 0;
Array A = { NULL,0,NULL,NULL };
ElemType arrayB[4][3] = { {1,2,3},{4,5,6},{7,8,9},{10,11,12} };
int dim = 2, bounds = 4, constants = 3, e = 0;
A = InitArray(A, dim, bounds, constants);
for (int i = 0; i < bounds; i++)
{
for (int j = 0; j < constants; j++) {
Assign(A, arrayB[i][j], i, j);
printf("value=%d\n", Value(A, e, i, j));
}
}
printf("A.dim=%d\n", A.dim); A = DestoryArray(A);
printf("A.base=%p\n", A.base);
}

C语言多维数组的实现与操作的更多相关文章

  1. c语言二维数组传递

    c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维 ...

  2. [语法]C语言中二维数组做输入参数

    C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...

  3. C语言中二维数组如何申请动态分配内存

    C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include <stdio.h> #include <malloc. ...

  4. 对二维数组使用指针进行操作的探索(C语言)

    /* Name: 对二维数组使用指针进行操作的探索 Copyright: Author: lingr7 Date: 01/12/18 11:55 Description: */ #include< ...

  5. 关于c语言二维数组与指针的个人理解及处理办法。

    相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...

  6. C语言多维数组的地址

    设有整型二维数组a[3][4]如下: 0   1   2   3 4   5   6   7 8   9  10  11  它的定义为:     int a[3][4]={{0,1,2,3},{4,5 ...

  7. C语言 二维数组复制、清零及打印显示

    #include <stdlib.h> #include <stdio.h> #include <string.h> //二维整型数组打印显示 ],int row, ...

  8. C语言二维数组作业

    一.PTA实验作业 题目1:7-3 出生年 1. 本题PTA提交列表 2. 设计思路 1.声明一个函数different()用来计算一个年份的不同数字个数 2.定义y(y是来计算符合要求的年份的量), ...

  9. C语言多维数组的指针传递

    在C语言中为了节省空间,提高运行速度经常使用指针来完成数组的传递. 对于一维数组而言可以直接传递首地址 而对于二维数组必须在传递时声明是二维数组的指针,并且调用时也要经过一些运算 首先是定义形参: 函 ...

  10. Go 语言多维数组

    Go 语言支持多维数组,以下为常用的多维数组声明方式: var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type 以下实例声明了三维的整型数组: ...

随机推荐

  1. bug处理记录:java.util.UnknownFormatConversionException: Conversion = 'Y'

    1. 报错: java.util.UnknownFormatConversionException: Conversion = 'Y' at java.util.Formatter$FormatSpe ...

  2. python 爬取豆瓣电影评论,并进行词云展示

    python 爬取豆瓣电影评论,并进行词云展示 本文旨在提供爬取豆瓣电影<我不是药神>评论和词云展示的代码样例 1.分析URL 2.爬取前10页评论 3.进行词云展示 1.分析URL 我不 ...

  3. ATM购物车

    ATM项目实现思路: ATM架构设计 三层架构 core目录下的src.py(浏览器) (展示层) interface目录下的多个py文件(框架) (核心逻辑层) db目录下db_handler.py ...

  4. 搭建漏洞环境及实战——搭建DVWA漏洞环境

    DVWA是一款开源的渗透测试漏洞练习平台,其中内涵XSS.SQL注入.文件上传.文件包含.CSRF和暴力破解等各个难度的测试环境. 1.在安装时需要在数据库里创建一个数据库名,进入MySQL管理中的p ...

  5. Less-1(GET字符型)

    union联合注入(方法一) 进入靶场 按照要求提交一个id:http://192.168.121.131/sqli/Less-1/?id=1 数据库执行语句:select * from news w ...

  6. 使用java代码调用rabbitmq接口进行新增编辑mq用户、虚拟机vhost、动态创建交换机exchange、队列queue以及设置权限,绑定vhost与exchange等操作

    使用java代码操作rabbitmq时,首先需要一个有创建用户等权限的管理员账号,需要在rabbitmq的后台管理页面手动创建这个账号,系统推荐的这几个tag可以让账号有rabbitmq后台管理页面的 ...

  7. S2-009 CVE-2011-3923

    漏洞名称 CVE-2011-3923 S2-009 远程代码执行漏洞 利用条件 Struts 2.0.0 - Struts 2.3.1.1 漏洞原理 OGNL提供了广泛的表达式评估功能等功能.该漏洞允 ...

  8. 【Dubbo3 终极特性】「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据中心、注册中心的原理及开发实战(中)

    承接上文 通过之前的[Dubbo3终极特性]「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据中心.注册中心的原理及开发实战(上),让我们对Dubbo3的三中心架构体系有了一定的认识 ...

  9. Quartz 使用教程

    首先说说,为什么要写这篇文章: Quartz 的 v2.3.2 版本改动比较大,目前网上的资料都是旧版本,很缺乏相关资料 很多资料讲解非常不全面,例如 Quartz Listener 的介绍和使用基本 ...

  10. Golang编译

    SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go SET CGO_ENABLED=0 SET GOOS=linux ...