C語言二維數組與指針(轉載)

原地址:http://ryan168.blog.163.com/blog/static/163617862009350650876/

C語言二維數組與指針

二維數組與指針

很多C++/C初學者對于二維數組與指針的關系總是搞不清楚,對它的誤解比比皆是。一下是本人的一些總結,部分內容參考相關資料,希望對大家的理解有所幫助。(本文對于C/C++而言)

首先,我們先從存儲的角度對二維數組作一個全面的了解。二維數組在內存中的存儲,是按照先行后列依次存放的。從內存的角度看,可以這樣說,二維數組其實就是一個一維數組,在內存中沒有二維的概念。如果把二維數組的每一行看成一個整體,即看成一個數組中的一個元素,那么整個二維數組就是一個一維數組,它以每一行作為它的元素,這個應該很好理解。

第一,我們來詳細介紹二維數組與指針的關系。-

首先定義個二維數組 array[3][4],p 為指向數組的指針。

若p=array[0],此時p指向的是二維數組第一行的首地址,則 p+i 將指向array[0]數組中的元素array[0][i]。由以上所介紹的二維數組在內存中的存儲方式可知,對數組中的任一元素array[i][j] ,其指針的形式為:p+i*N+j (N為每一行的長度)。 元素相應的指針表示法為:*(p+i*N+j) ,下標表示法為:p[i*N+j] 。

For Example:

array[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};

int * p=array[0];

數組array有四個元素,分別為array[0],array[1],array[2],array[3],每個元素為包含3個元素的一維數組,

如array[0]的3個元素為 array[0][0],array[0][1],array[0][2]。

元素array[2][2]對應指針為:array+2*3+2,

指針表示法為:*(array+2*3+2) ,

下標表示法為:array[2*3+2] 。

特別注意:雖然 array[0] 與 array 都是數組首地址,但兩者指向的對象不同,這點要非常明確。array[0]?是一維數組的名字,它指向的是一維數組array[0]的首地址,所以 *array[0]與array[0][0]為同個值。而 array 是二維數組的名字,它指向的是所屬元素的首地址,其每個元素為一個行數組。它是以‘行’來作為指針移動單位的,如array+i 指向的是第 i 行。對 array 進行 * 運算,得到的是一維數組 array[0] 的首地址,所以 *array 與 array[0] 為同個值。如果定義 int* p,p為指int類型的指針,指向int 類型,而不是地址。故以下操作 :p=array[0] (正確) ,p=array (錯誤) 。這點要非常注意。

第二,看看如何用數組名作地址表示其中元素。

我們知道,對二維數組array ,array[0] 由 array指向,故*array 與array[0] 是相同的,依次類推可得?array[i] 由array+i 指向,*(array+i) 與array[i]是相同的。 因此,對于數組元素 array[i][j] ,用數組名表示為 *(*(array+i)+j) ,指向該元素的指針為 *(array+i)+j 。

注意:數組名雖然是地址,但與指向數組的指針性質不同。指針變量可以隨時改變其所指向對象,而數組名不可以,一旦被定義,就不能通過賦值使其指向另外一個數組,但是在Java中則可以。

第三,順便了解一下不太常用的‘行數組指針’。

我們知道,對于二維數組array[4][3],與int* p?。二維數組名array 不能直接賦值給p。原因前面已講過,兩只的對象性質不同。 在C語言中,我們可以通過定義一個行數組指針,使得這個指針與二維數組名具有同樣的性質,實現它們之間可以直接賦值。行數組指針定義如下:

int (*p)[3]; 它表示,數組 *p 具有三個int類型元素,分別為 (*p)[0] , (*p)[1] , (*p)[2] ,即 p指向的是具有三個int類型的一維數組,也就是說,p為行指針。此時,以下運算 p=array 是正確的。

第四,二維數組作為函數參數。

二維數組作為函數參數一般有兩種方式:(1) void func(int **array){...}? ?(2) void func(int array[ ][N])

注意第二種方式一定要指明二維數組的列數

當二維數組名作為函數實參時,對應的形參必須是一個行指針變量。

和一維數組一樣,數組名傳送給變量的是一個地址值,因此,對應的形參也必須是一個類型相同的指針變量,在函數中引用的將是主函數中的數組元素,系統只為形參開辟一個存放地址的存儲單元,而不可能在調用函數時為形參開辟一系列存放數組的存儲單元。

int main()

{

double a[3][4];

……

fun(a);

……

}

fun(double (*a)[n])

{

……

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數據結構; ...
    朱森閱讀 3,479評論 3 44
  • 計算機二級C語言上機題庫(南開版) 1.m個人的成績存放在score數組中,請編寫函數fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,478評論 1 42
  • 1.語言中變量的實質 要理解C指針,我認為一定要理解C中“變量”的存儲實質, 所以我就從“變量”這個東西開始講起吧...
    金巴多閱讀 1,832評論 0 9
  • 前言:指針是 C語言一個重要概念,也是C 語言的一個重要特色。使程序簡潔、緊湊、高效。指針乃是C之精華。 數據在內...
    瀟湘候晨雪閱讀 780評論 0 0
  • 中午吃飯間,跟巫討論《人民名義》婚姻觀,他問我,你覺得哪個人的婚姻觀是最真實,我說其實他們的幾個挺真實的,比如梁璐...
    陳淑玲閱讀 246評論 0 1