程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++二維數組和指針的關系

C++二維數組和指針的關系

編輯:C++入門知識

借鑒了點擊打開鏈接和點擊打開鏈接,並部分修改。


再翻開C++ primer時,不禁感歎此書的嚴謹細致。再學習下數組和指針。主要講解二維數組和指針的對應關系。

掃盲+復習:

數組是一種復合數據類型,對數據類型,必然要介紹定義和初始化。

定義和初始化:數組的維數必須用值大於等於1的常量表達式定義。此常量表達式只能包含整型字面值常量、枚舉常量貨用常量表達式初始化的整型const對象。非const變量及要到運行階段才知道其值的const變量都不能用於定義數組的維數。顯示初始化的數組不需要指定其維數值。沒有引用類型的數組。

對初始化說兩句:函數體外定義的內置數組類型,元素初始化為0;體內定義無初始化。元素類型為類類型時,默認構造函數初始化,無默認構造函數,則必須顯示初始化,與數組定義位置無關。字符數組用字符串字面值初始化時,注意字符串字面值包含一個額外的空字符。再叨叨一句指針:理解指針聲明語句時,請從右往左閱讀。

 

//以下是本文介紹的重點:

數組名----二維數組的存儲----指針和二維數組的關系-----指針和數組的轉換關系深入講解

 

一、先說說數組名,數組名代表數組第一個元素的指針。對一維數組,數組名就代表首元素地址;對二維數組,因其元素是數組,所以數組名代表首個行地址。

對二維數組a,區分下a和a[0]:

a代表首個行地址,它的每個元素都是一個行數組,因此,它的指針移動單位是“行”。使用a[0]是把二維數組看做一個一維數組來處理,即它的元素不再是行,而是單個數組元素。所以它指向的是數組的首個元素,它的指針移動單位是“單個數組元素”。

 

二、二維數組在內存中如何存儲:

int a[2][3]={1,2,3,4,5,6};

int m=a[0][5];//m=6

所以C++的數組在內存中是沒有維數的概念的。二維數組存儲時,是按照先行後列的順序依次存儲的。把每行看做一個整體,即視為一個大的數組元素。

 

三、指針和二維數組的對應關系:

1) 指針對應的二維數組元素地址:

int a[2][3]={1,2,3,4,5,6};

int* p=a[0];

int m=*(p+3);//m=4     即若有p=a[0](a是二維數組),則p+j指向a[0][j]。

2) 二維數組元素地址對應的指針:

int a[2][3]={1,2,3,4,5,6};

int* p=a[0];

a[i][j]=*(p+i*列數+j);或a[i][j]=p[i*列數+j];

3) 二維數組名和二維數組元素的對應關系:

用二維數組名作地址表示數組元素:二維數組a表示行元素,a+i表示第i個行元素。所以a [i] [j]用數組名表示為:*(*(a+i)+j)

 

4) 行數組指針:

int a[2][3]={1,2,3,4,5,6};

int** p=a;//編譯錯誤

可以通過定義數組指針的方式,使得一個指針變量與二維數組名具有相同的性質。定義方法:int (*p)[4]=a;

區分數組指針和指針數組:數組指針是指向數組首元素的地址的指針,其本質為指針,定義為:int (*ptr_array) [10];。指針數組是數組元素為指針的數組,其本質為數組,定義為:int *ptr_array[10];。

 

四、深入講解:

void function(int**array,int width,int height)

然後我們定義了一個二維數組 intp[3][3]={{1,2,3},{4,5,6},{7,8,9}};

當我們調用function時,即function(p,3,3),編譯器會報錯:

error C2664:'function' : cannot convert parameter 1 from int [3][3]' to int **'

數組名和指針還是有區別的。C++支持數組自動轉為指針類型,但指針無法自動轉換為數組類型,轉換是基於從外層到內層的順序開始轉換,外層相同不再轉換。

這兒為了方便講解,先說個關系:把指針的數組認為是數組嵌套在指針外層,C++支持的轉換只能從外層至內層的順序轉換,若外層相同不轉換。所以,array(指針的指針)和p(數組的首元素地址,即數組首元素的指針)不能轉換為同一類型。對數組指針和指針數組:指針數組可轉為指針的指針,指針的指針與數組指針不同。用代碼表示即:

int a[2][3];

int (*p)[2]=a;// 這個沒轉換,p是數組的指針,a也是

int *arr[3];

int **q=arr;//arr是指針數組,轉為指針的指針

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved