二維數組存儲方式和使用


--------------------------------------------------------------------------------------------------------------------------------

目錄:

 第一部分:二維數組在內存中的存儲方式

 第二部分:二維數組作為函數形參的使用

---------------------------------------------------------------------------------------------------------------------------------

                                                        第一部分:二維數組在內存中的存儲方式

      對於二維數組,首先需要知道它在內存中是以怎樣的方式來存儲的,引用以下博客的內容說明:http://blog.csdn.net/dhl0317/article/details/5471601

  二維數組A[m][n]可以視為由m個行向量組成的向量,或者是由n個列向量組成的向量。

                              

  由於計算機的內存是一維的,多維數組的元素應排成線性序列后存入存儲器。數組一般不做插入和刪除操作,即結構中元素個數和元素間的關系不變。所以采用順序存儲方法表示數組。

1、  行優先存儲

將數組元素按行向量排列,第i+1個行向量緊接在第i個行向量后面。

【例】二維數組A[m][n]按行優先存儲的線性序列為:

A[0][0]、A[0][1]…A[0][n]、A[1][1]、A[1][1]…A[1][n]…A[m][n]、A[m][1]…A[m][n]

在PASCAL和C語言中數組按行優先順序存儲

2、  列優先存儲

將數組元素按列向量排列,第i+1個列向量緊接在第i個列向量后面。

【例】二維數組A[m][n]按列優先存儲的線性序列為:

A[0][0]、A[1][0]…A[m][0]、A[0][1]、A[1][1]…A[m][1]…A[m][1]、A[0][n]…A[m][n]

ORTRAN語言中,數組按列優先順序存儲。

                                       第二部分:二維數組作為函數形參的使用

對於二維數據作為函數形參的使用,可以使用以下幾種方式。先科普一下指針和二維數組的關系:

例如:int a[3][5]

(a+i) 代表是整個第i行的地址
*(a+i)就表示第i行首元素的地址
*(a+i) + j ===> & a[i][j]
*( *(a+i) + j) ===>a[i][j]元素的值

test_func1()/test_func2()/test_func3()這3個函數的執行結果是相同的。
test_func3()函數是根據二維數組在內存中的存儲方式實現,使用時要特別注意。
 1 #include <stdio.h>
 2 
 3 //void test_func1(unsigned char i, unsigned char ary[][3])
 4 void test_func2(unsigned char i, unsigned int (*ary)[3])
 5 {
 6     unsigned int i_x, i_y , temp =0;
 7     for(i_y = 0; i_y < i; i_y++)
 8     {
 9         for(i_x = 0; i_x < 3; i_x++)
10         {
11            ary[i_y][i_x] = temp;
12            temp++;    
13         }        
14     }
15 }
16 void test_func3(unsigned int *ptr_array)
17 {
18     unsigned int i_x, temp =0;
19     for(i_x = 0; i_x < 6; i_x++)
20     {
21        *ptr_array = temp;
22            ptr_array++;       
23            temp++;
24     }
25 }
26 //------------------------------------------------------------
27 int main(void)
28 {
29     unsigned int m,n;
30     unsigned int array_A[2][3];
31     //test_func1(2, array_A);
32     test_func2(2, array_A);
33     //test_func3(&array_A[0][0]);
34     for(m = 0; m < 2; m++)
35     {
36         for(n = 0; n < 3; n++)
37         {
38             printf("array_A[%d][%d]: %d \n", m, n, array_A[m][n]);    
39         }
40     }    
41 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM