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

若是咱們按照C語言的方式存儲它,也就是行優先存儲的話,那麼在內存中,它的形狀是這樣的:數組

這種存儲方式又被稱做C contiguous array。函數

C語言數組結構列優先順序存儲的實現 (GCC編譯)。測試

從行優先轉換爲列優先存儲方式,與行優先相比,不一樣之處在於改變了數組維界基址的前後順序, 從而改變了映像函數常量基址。spa

/**
 * @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 );
     ;
 }

運行測試:code

以上就是c語言數組中以列優先對嗎的詳細內容,但願對你有所幫助。blog

閱讀原文:c語言數組中以列優先對嗎?內存

相關文章
相關標籤/搜索