c语言数组中以列优先对吗

互联网 19-11-18

如果我们按照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语言数组中以列优先对吗的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: c语言
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:java与c哪个简单?

相关资讯