c语言数组中以列优先对吗
技术  /  管理员 发布于 5年前   370
如果我们按照C语言的方式存储它,也就是行优先存储的话,那么在内存中,它的形状是这样的:
这种存储方式又被称作C contiguous array。 ( 推荐学习:web前端视频教程)
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语言数组中以列优先对吗的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号