c語言指標中多維陣列的引用aij表示

2021-03-19 18:34:45 字數 6054 閱讀 9450

1樓:喵不語

*(*(p+i)+j)

2樓:再醉不逍遙

表示陣列a中元素a[首地址+i+j]

3樓:匿名使用者

a[i][j]=*(*(a+i)+j)

請問c++中指標與二維陣列,下面圖中程式裡的 *(p+i*3+j) 是什麼意思啊? 謝謝 20

4樓:匿名使用者

這個利用的是二維陣列還是順序儲存的特點來直接計算a[i][j]的儲存位置

*(p+i*3+j)就是a[i][j],因為p是指向首元素的元素指標,a每行有3個元素,這樣a[i][j]按行優先儲存時,和a[0][0]差了這麼多個元素:i*3+j

a[0] 就是a[0][0]的地址

5樓:匿名使用者

*(p+i*3+j) 相當於 a[i][j]

為什麼c語言中*(a+i)+j能表示a[i][j]的地址

6樓:

int a[3][4]; //假設定義一個3行4列的二維陣列,所謂二維陣列就是陣列的陣列

a[0]、a[1]、a[2]是陣列a的元素,而這個元素是陣列,而不是我們通常認為的基本資料型別的資料

所以*(a+i)就是獲取陣列a中第i個元素,等價於a[i],而a[i]本身又是一個包含有4個int型數值的陣列,a[i]是這個一維陣列的陣列名,我們知道陣列名的本質是一個地址,是陣列首元素地址,所以

*(a+i)+j就是表示下表第i行的第j個元素的地址了。所以,

*(a+i)+j表示的含義是元素a[i][j]的地址,也可以用a[i]+j來表示。

7樓:聽不清啊

int a[2][3]=;

printf("%d ",*(*(a+1)+2));

以上的引用能夠輸出60

因為a是二維陣列名,所以它是指向指標的指標(二級指標)。

*(a+1)就是a[1],它是一個一維陣列,也是一維陣列的首地址(指向一維陣列首元素的指標)。*(a+1)+2就是a[1][2]的地址,*(*(a+1)+2)就是a[1][2]。

8樓:匿名使用者

*(a+0)取出a[0]的值

a[0]的元素又是一個一維陣列

因此*(a+0)取出的就是這個一維元素的首地址那麼*(a+0)+0表示: 一維陣列a[n]中, a+0陣列元素a[0]的地址

*(a+0)+1表示一維陣列的1號陣列元素的地址

c語言中二維陣列的指標如何表示

9樓:夜禮服假面

二維陣列和指標

(1) 用指標表示二維陣列元素。

要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。

一個二維陣列在計算機中儲存時,是按行儲存的,即先儲存第一行的元素,再儲存第二行的元素。

當把每一行看作一個整體,即作為一個大的陣列元素時,原來的二維陣列也就變成一個一維陣列了。而每個大陣列元素對應原來二維陣列中的一行,稱為行陣列元素,顯然每個行陣列元素都是一個一維陣列。

下面討論二維陣列元素和指標之間的對應關係,清楚了二者之間的關係,就能用指標處理二維陣列了。

設p是指向二維陣列a[m][n]的指標變數,若有:p=a[0]; 則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:p+i*n+j用"*"運算子表示為:*( p+i*n+j)同樣,a[i][j]也可使用指標下標法表示,如下:

p[i*n+j]

例如,有如下定義:

int a[3][4]=,,};

則陣列a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是一個一維陣列,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0];

則陣列a的元素a[1][2]對應的指標為:p+1*4+2

元素a[1][2]也就可以表示為:*( p+1*4+2)

用下標表示法,a[1][2]表示為:p[1*4+2]

特別說明:

對上述二維陣列a,雖然a[0]、a都是陣列首地址,但二者指向的物件不同。

a[0]是一維陣列的名字,它指向的是一維陣列a[0]的首元素a[0][0],對其進行「*」運算,得到的是一維陣列元素a[0][0]的值,即*a[0]與a[0][0]是同一個值。

而a是一個二維陣列的名字,它指向的是二維陣列a的首元素a[0],對a進行「*」運算,得到的是一維陣列a[0]的首地址,即*a與a[0]是同一個值。它的指標移動單位是「行」,所以a+i指向的是第i個行陣列,即指向a[i]。

當用int *p;定義指標p時,p的指向是一個int型資料,而不是一個地址,因此,用a[0]對p賦值是正確的,而用a對p賦值是錯誤的。這一點請務必注意。

示例:#include

int main()

,,};

int *p=a[0],max,i,j,row,col;

max=a[0][0];

row=col=0;

for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(*(p+i*4+j)>max)

printf("address of a is:%x\n", (unsigned int)a);

printf("address of a[0] is:%x\n", (unsigned int)a[0]);

printf("address of (a+1) is:%x\n", (unsigned int)(a+1));

printf("address of (a[0]+1) is:%x\n", (unsigned int)(a[0]+1));

return 0;

}執行結果:

a[2][1]=88

address of a is:bfdc0368

address of a[0] is:bfdc0368

address of a[0][0] is:bfdc0368

address of (a+1) is:bfdc0378

address of (a[0]+1) is:bfdc036c

address of (a[0][0]+1) is:bfdc036c

從結果看出,a,a[0],a[0][0]是同一個地址,

(2) 用二維陣列名作地址表示陣列元素。

另外,由上述說明,還可以得到二維陣列元素的一種表示方法:

對於二維陣列a,其a[0]陣列由a指向,a[1]陣列則由a+1指向,a[2]陣列由a+2指向,以此類推。因此,*a與a[0]等價、*(a+1)與a[1]等價、*(a+2)與a[2]等價,┅,即對於a[i]陣列,由*(a+i)指向。由此,對於陣列元素a[i][j],用陣列名a的表示形式為:

*(*(a+i)+j)指向該元素的指標為:*(a+i)+j陣列名雖然是陣列的地址,但它和指向陣列的指標變數不完全相同。指標變數的值可以改變,即它可以隨時指向不同的陣列或同型別變數,而陣列名自它定義時起就確定下來,不能通過賦值的方式使該陣列名指向另外一個陣列。

示例:求二維陣列元素的最大值。

該問題只需對陣列元素遍歷,即可求解。因此,可以通過順序移動陣列指標的方法實現。

main()

,,};

int *p,max;

for(p=a[0],max=*p;pmax)

max=*p;

printf("max=%d/n",max);

}執行結果:

max=88

這個程式的主要演算法都是在for語句中實現的:p是一個int型指標變數;p=a[0]是置陣列的首元素地址為指標初值;max=*p將陣列的首元素值a[0][0]作為最大值初值;pmax)

}程式執行結果:

a[2][1]=88

(3) 行陣列指標

對於指標,不管有多複雜,按照以下原則進行分析:

從變數名處起,根據運算子優先順序結合,一步一步分析。

在上面的說明中已經知道,二維陣列名是指向行的,它不能對如下說明的指標變數p直接賦值:

int a[3][4]=,,},*p;其原因就是p與a的物件性質不同,或者說二者不是同一級指標。c語言可以通過定義行陣列指標的方法,使得一個指標變數與二維陣列名具有相同的性質。

行陣列指標的定義方法如下:

資料型別 (*指標變數名)[二維陣列列數];

例如,對上述a陣列,行陣列指標定義如下:

int (*p)[4];它表示,陣列*p有4個int型元素,分別為(*p)[0]、(*p)[1]、(*p)[2]、(*p)[3] ,亦即p指向的是有4個int型元素的一維陣列,即p為行指標。

(按照指標的分析原則進行分析:p先與*結合,說明p是一個指標,然後與結合,說明指標指向的內容是含4個元素的陣列,然後與int結合,說明陣列中的元素為int型別。所以p是一個指向含4個int型別元素的陣列的指標。

)此時,可用如下方式對指標p賦值:p=a;為做對比,比較一下如下指標:int *p[4];

(按照指標的分析原則進行分析:p先與結合,說明p是一個陣列,然後與*結合,說明陣列的元素為指標,然後與int結合,說明指標指向的是int型別的變數。所以p是一個含4個元素的指向int型別變數的指標組成的陣列。

)此外二維陣列不可以用int**型別直接賦值訪問

10樓:匿名使用者

小的示例程式:

#include

#include

using namespace std;

int a[3][4];

int main()

}這段示例程式在我本地上執行

的結果為:

&a[i][0] = 4214816

a + i = 4214816; *(a + i) = 4214816;

&a[i][0] = 4214832

a + i = 4214832; *(a + i) = 4214832;

&a[i][0] = 4214848

a + i = 4214848; *(a + i) = 4214848;

我想看到這個執行結果,你已經有所瞭解了,下面我再詳細說一下:

指標量a作為一個二維陣列的指標量,其本質是一個「指向指標的指標」(為了方便,下面稱其為雙重指標),或者你可以理解為a為int**型別的指標量。當a做加減運算時,得到的結果仍然是一個「雙重指標」,即a + i是一個雙重指標,它是一個指向了原陣列第i行的起始位置的雙重指標。

而*(a + i)原來的雙重指標解引用後得到的一個指標變數,他是一個指向了原陣列第i行的起始位置的「單重指標」。

可以看出,a + i和*(a + i)儘管資料型別不同(前者為雙重指標,後者為單重指標),但是他們指向同一塊記憶體地址,因此作為指標量,他們的值是相等的。注意,僅僅是說,他們的值在數學上是相等的,並非說「他們是等價的」。

你的第二個問題亦是同理:

首先,作為c語言的操作符,本身即具有「解引用」的語義。明白的說,就是a[i]與*(a + i)是完全等價的,而&a[i]即等價於a + i。由於易知a + i和*(a + i)在數值上相當,那麼進行等價帶花可以知道,&a[i]和a[i]在數值上相等。

當然,此處仍非等價關係。

至於指向行的指標,所指的就是指向行首位置的指標量。

至於你的最後一個問題,正如我剛才一直強調的那樣,等號兩端僅僅是數值上的相等,而非等價關係,因此無法按照你所設想的方式進行歸納推導。

另外,虛機團上產品**,超級便宜

c 指標陣列問題,C 中關於指標陣列的問題。

是錯誤的。char cchar count 宣告瞭cchar是有count個元素的陣列,每個元素都是指向char型變數的指標。但cin cchar i 卻試圖給cchar的第二個元素 指標 賦一個鍵盤值 這裡指標還沒有確定指向,是隨機的,它隨機地指向了不能寫入的地方,就要出錯。這裡應該先給指標陣列賦...

C 中引用與指標的區別,請簡述c 中引用和指標的區別

c 中指標與引用的區別 1.定義和性質的區別 1 指標 指標是一個變數,只不過這個變數儲存的是一個地址,指向記憶體的一個儲存單元 而引用跟原來的變數實質上是同一個東西,只不過是原變數的一個別名而已。如 int a 1 int p a int a 1 int b a 上面定義了一個整形變數和一個指標變...

c語言中指標和引用的區別,C語言中指標和引用的區別

指標,全稱為指標變數,是用來儲存記憶體地址的一種變數。程式中,一般通過指標來訪問其指向的記憶體地址中的內容 資料 引用,是c 中提出來的一種新的使用變數的方式,即,給實際變數起個別名,通過這個別名來引用實際的變數。標準c中不支援變數的引用。這兩個概念沒有任何相關性。指標是實實在在的變數,有自己的記憶...