ITPub博客

首页 > 应用开发 > > 你知道c语言数组中以列优先对吗?求大神来评论

你知道c语言数组中以列优先对吗?求大神来评论

作者:westwolf 时间:2019-11-20 16:37:08 0 删除 编辑

big老师



如果我们按照C语言的方式存储它,也就是行优先存储的话,那么在内存中,它的形状是这样的:

这种存储方式又被称作C contiguous array。

C语言数组结构列优先顺序存储的实现 (GCC编译)。

从行优先转换为列优先存储方式,与行优先相比,不同之处在于改变了数组维界基址的先后顺序, 从而改变了映像函数常量基址。

/**

* @brief C语言 数组 列优先 实现

* @author wid

* @date 2013-11-02

*

* @note 若代码存在 bug 或程序缺陷, 请留言反馈, 谢谢!

*/

#include <stdio.h>

#include <stdlib.h>

#include <stdarg.h>

#include <assert.h>

#define OK 1

#define ERROR -1

#define MAX_DIM 8 ///允许的最大数组维数

typedef int ElemType;

typedef struct

{

ElemType *base; ///数组元素基址

int dim; ///数组维数

int *bounds; ///数组维界基址

int *constants; ///数组映像函数常量基址

}Array; ///数组结构

///数组方法声明

int InitArray( Array *pArr, int nDim, ... ); ///初始化数组 pArr

void DestroyArray( Array *pArr ); ///销毁数组 pArr

int Locate( Array *pArr, int nDim, va_list ap ); ///定位下标指向的元素在数组中的位置

int Assign( Array *pArr, ElemType *elm, ... ); ///数组赋值

int Value( Array *pArr, ElemType *elm, ... ); ///数组取值

///数组方法实现

/**

* @brief 初始化数组

*

* @param pArr 指向待初始化的数组

* @param nDim 数组的维数

* @param ... 数组各维数的长度

*

* @return 初始化成功返回OK, 否则返回ERROR

*/

int InitArray( Array *pArr, int nDim, ... )

{

|| nDim > MAX_DIM )

return ERROR;

///初始化 pArr 数组维数属性

pArr->dim = nDim;

///构造数组维界基址

pArr->bounds = (int *)malloc( nDim * sizeof(int) );

if( !pArr->bounds )

return ERROR;

, nElemCount = ;

va_list ap;

va_start( ap, nDim );

/// i = nDim - 1, 使列优先

; i >= ; --i )

{

pArr->bounds[i] = va_arg( ap, int );

)

return ERROR;

nElemCount *= pArr->bounds[i];

}

va_end(ap);

///初始化元素基址

pArr->base = (ElemType *)malloc( nElemCount * sizeof(ElemType) );

if( !pArr->base )

return ERROR;

///初始化函数映像常数基址

pArr->constants = (int *)malloc( nDim * sizeof(int) );

///递推求常量基址, 列优先

pArr->constants[nDim-] = ;

; i >= ; --i )

{

pArr->constants[i] = pArr->bounds[i+] * pArr->constants[i+];

}

return OK;

}

/**

* @brief 销毁数组 pArr

*

* @param pArr 指向待销毁的数组

*/

void DestroyArray( Array *pArr )

{

if( pArr->base )

free( pArr->base );

if( pArr->bounds )

free( pArr->bounds );

if( pArr->constants )

free( pArr->constants );

}

/**

* @brief 定位数组下标指向的元素在数组中的位置

*

* @param 指向的数组

* @param ... 数组的下标

*

* @return 若下标合法, 返回下标在数组中的位置, 否则返回 ERROR

*/

int Locate( Array *pArr, int nDim, va_list ap )

{

, ind = , i = ;

///列优先求地址

; i >= ; --i )

{

ind = va_arg( ap, int );

///使用断言, 确保下标合法

assert( ind >= && ind < pArr->bounds[i] );

nPos += pArr->constants[i] * ind;

}

va_end(ap);

return nPos;

}

/**

* @brief 数组赋值

*

* @param pArr 指向待赋值的数组

* @param elm 指向赋值元素

* @param nDim 数组维数

* @param ... 数组下标

*

* @param 赋值成功返回 OK, 否则返回 ERROR

*/

int Assign( Array *pArr, ElemType *elm, ... )

{

;

va_list ap;

va_start( ap, elm );

nPos = Locate( pArr, pArr->dim, ap );

*(pArr->base + nPos) = *elm;

return OK;

}

/**

* @brief 数组取值

*/

int Value( Array *pArr, ElemType *elm, ... )

{

;

va_list ap;

va_start( ap, elm );

nPos = Locate( pArr, pArr->dim, ap );

*elm = *(pArr->base + nPos);

printf( "addr = 0x%X\n", pArr->base + nPos );

return OK;

}

int main()

{

Array arr;

///初始化一个三维数组, 大小为 2x3x5

InitArray( &arr, , , , );

;

///赋值测试

, m = , n = ;

; i < ; ++i )

; m < ; ++m )

; n < ; ++n )

{

a = i + m + n;

Assign( &arr, &a, i, m, n );

}

;

///取值测试

; i < ; ++i )

; m < ; ++m )

; n < ; ++n )

{

Value( &arr, &b, i, m, n );

printf( "[%d][%d][%d]=%d\n", i, m, n, b );

}

///销毁数组

DestroyArray( &arr );

;

}

运行测试:

以上就是c语言数组中以列优先对吗的详细内容,希望对你有所帮助。环印关注我们,来获取更多的资源,也可以点击下方了解更多进入到我们的平台来查看更多的内容。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4662/viewspace-3140945/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-07-26

  • 博文量
    307
  • 访问量
    21673