c語言數組中以列優先對嗎

(*-*)浩
發布: 2019-11-18 14:45:30
原創
2928 人瀏覽過

c語言數組中以列優先對嗎

如果我們按照C語言的方式儲存它,也就是行優先儲存的話,那麼在記憶體中,它的形狀是這樣的:

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語言數組中以列優先對嗎

#

以上是c語言數組中以列優先對嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!