c語言 二維陣列指標中的和,C語言 二維陣列指標中的 和

2021-12-16 10:13:45 字數 5090 閱讀 9960

1樓:鷹眼不是漆無害

要回答你的這個問題,不妨先根據你的問題先編寫一段小的示例程式:

#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]在數值上相等。

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

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

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

2樓:

c 語言,指標的麻煩 是 形式邏輯 不成立,也就是我們習慣的 數學 -- 代數學 方式 不成立。

所以 「可不可以從數學上推導出」-- 答案 是 不可以。

c 語言,宣告中如果寫:

int *a; // 宣告 a 是 指標,指向 int

這時語句中 允許出現 *a 和 a, 不允許出現 &a. a表示指向的位址,*a 表示值。

宣告中如果寫:

int a; // 宣告 a 是 整型變數,不是指標

這時語句中 允許出現 a 和 &a, 不允許出現 *a. a 表示值,&a表示a的位址。

我想,你已經看出 讓人頭痛之處。

int a[3][4]; // 宣告 a 是 二維陣列,

這時語句中 允許出現 a[j][i], &a[j][i], 不允許出現 *a[j][i].

二維陣列的始位址是 &a[0][0].

初學者,掌握我上面說的即可。

a+i 和 *(a+i) 怎麼會是一樣的呢?-- 這是c語言 不嚴格性 造成的,c語言 說 二維陣列a 的始位址是 &a[0][0], 但也是 &a[0], 也是a.

a+i 呢 是 &a[0][0] + i * [4].

a+i 和 *(a+i) 是一樣的 -- c語言裡確實如此,這是c語言編譯器裡的計算方法造成的。

對於這些繁瑣不實用的東西,不要深究,不要用它。

3樓:匿名使用者

1.a[3][4]表示第三行,第四列。

a+i的a是乙個陣列,他會自動轉化為指標,指向陣列的第一行,也就是a[0],或者a[0][0],因為第一行的位址起始就是第乙個元素位址。所以a[0]和a[0][0]是一樣的。所以a+i起始就是a[0]+i,0表示陣列的行,i表示列。

*(a+i)其中的a和i同上。

2.a[i]代表乙個數值,假設你的陣列時int型別,比如a[i]=6;那加上&就表示對該變數取位址,想想,6你怎麼取位址還是6,對不對?所以都差不多。

3.你見過int *p;吧,這個陣列在運算的時候自動回轉化為指標,比如int *p; int a[10];你一定見過

p = a; 這把a賦值給了乙個指標,這就說明a在其實是乙個指標,又因為a相當於乙個指標(他又是陣列),我們說二維陣列是兩個一維陣列,所以當然就有指向行與列的指標了。

4.關於這點,本人也沒有深究過,但作為過來人,我想說的是,不要死扣語法,語法這東西是人定的,不是計算機定的,如果你實在要去研究這個***,那去學彙編,這可以幫助你。

4樓:

對於第1、3、4問題:

先弄清楚等價關係:

一維陣列中:&a[i]與a+i等價,a[i]與*(a+i)等價

二維陣列中:&a[i][j]與a[i]+j、*(a+i)+j等價,a[i][j]與*(a[i]+j)、*(*(a+i)+j)等價。

你的問題中:

a+i是&a[i]的變換寫法,表示第i行的起始位址。a+i+1則同為*a[i+1],即下一行的起始位址。

*(a+1)是a[i]的變換寫法,同時也表示&(a[i]+0)或&a[i][0],即表示第i行第0列的起始位址。若*(a+1)+1,與a[i]+1相同,也與&a[i][1]相同,它是表示第i行第1列的位址。

a+i與*(a+1)的值相同,但概念不同。前者是行指標,加1會指向下一行;後者是列指標,加1會指下本行的下一列。列指標相當於班長,他走一步(加1)只經過一名戰士;行指標相當於排長,他走一步(加1)要經過乙個班的戰士。

如果開始時,一班長和排長都站在一班第1個戰士處(他們的位址相同),一班長走一步,到達他班的第2名戰士處;而排長走一步,則到達第二班第1名戰士處。

對於第2個問題:

c語言中,下標是一種運算子,它的運算級別高於取位址運算子&。所以,對於&a[i]的寫法,你應該把a[i]當成乙個整體,比如把a[i]當成b,那麼&a[i]就可以理解成&b了

5樓:匿名使用者

1、我看了你說的這兩頁,書上的原話是這樣的:「在二維陣列中,a+i,*(a+i),&a[i],&a[i][0]的值相等,即他們都是同一位址值」,要注意這個字眼「位址值」,也就是說,這幾種表達方式並不是記憶體中存的數值,而是存放陣列的位址的值,首先要弄明白,首位址這個概念,如果只寫陣列名,就代表陣列的首位址,比如,一維陣列a[9],a就代表陣列首個元素的位址即首位址,a[0]是首個元素而&a[0],你可以把&理解成取位址符,即取出存放該數的位址,那麼&a[0]就代表陣列首個元素的位址了,即首位址,即a和&a[0]是乙個意思,

在看二維陣列,二維陣列只是比一維陣列多了乙個「首位址」,即列的首位址,比如a[3][4],a[0]代表什麼?a[0]是該二維陣列第一行的首位址,這個根據前面我所說的能明白麼?那麼a代表什麼呢?

這個其實也是首位址,都是代表陣列首行首列資料的位址,值是一樣的,接下來就要根據上面的思路認真琢磨思考了,a+i代表什麼?注意這個i,a[i][j],其中的i代表的是陣列的行,j代表的是陣列的列,a+i,其實是加了i行,也就是第i行的第乙個元素的位址,可以理解成a[i](把a[i]這一行想象成以為陣列,根據一維陣列的思路思考,就能明白了),即a+i和a[i]的值相等,如書上所說,在根據上面解釋一維陣列的思路考慮,&a[i][0]代表什麼意思?不難理解,這代表的是第i行的首位址,也就是第i行的第乙個元素的位址,如書所說,a+i,a[i],&a[i][0]的值是一樣的,

還有乙個是*(a+i),這個就需要轉轉腦筋了,二維陣列用指標怎麼表示?用二維指標即:**a,那麼a[3][4]這個資料(注意是乙個數值)用指標怎麼表示呢?

*(*(a+3)+4),必須有兩個「*」才行,要不就是一維陣列了,裡面是*(a+3)這代表的是第三行沒錯吧,第三行的什麼呢?第三行的首位址沒錯吧,*(a+3)+4代表什麼?代表第3行第4個元素的位址,在最前面加個「*」,*(*(a+3)+4)就是a[3][4]了,那麼*(a+i)代表什麼?

代表第i行的首位址沒錯吧。。。,那麼上面說的a+i代表什麼呢?看看就知道了,也是第i行的首位址,也就是a+i和*(a+i)的值是一樣的,如書所說,這樣書上的那句話就都明白了

2、關於這個問題,確實有點繞,如果能理解你問的第3個問題,這個就有點眉目了。。。

3、在二維指標當中(注意指標和陣列是不一樣的,只是有時候表達的東西沒什麼區別罷了),在二維指標中,分行指標和列指標,比如上面的a[3][4],如果用指標的形式表示的話,一共有3個行指標,乙個列指標,每個行指標都僅指向行的首位址,這個列指標指向的是,第一行的首位址,這個如果用圖來表示就再好不過了,可是我沒辦法在這上面畫圖,就這樣表示吧,看下面:

列指標: a

|行指標1: a[0]—。。。。。。。

行指標2: a[1]—。。。。。。。

行指標3: a[2]—。。。。。。。

4、我也不知道這樣說對不對,反正我沒試過,你不仿試試看。。。

其實這些問題都沒必要深究,剛開始學這部分,確實是非常難懂,但只要寫的程式多了,用的多了,自然而然就懂了,

最後,祝你成功

6樓:

1.a+i和*(a+i)不是一樣的,a[i]和*(a+i)才是一樣的。a[i]表示陣列a第i個元素,而*(a+i)指的是先將a所在位址後移i位以後,讀取位址儲存的內容,是一樣的。

請注意這個*,是指標運算子。指標運算子(*)與解引用操作符(*)是乙個東西。對指標使用解引用操作符時,直接相當於是對指標指向的物件的乙個引用。

dereference 用來取出指標所指物體的內容。

2.為什麼a[i]不是變數呢?i不是一直在變麼?所以a[i]也是一直在變的。a[i]的位址也就隨元素的變化,在變化啊!

3.二維陣列,可以看成線性代數裡的行列式,這個懂吧。比如a[i][j],i代表的就是行,j代表的就是列了。

這裡就有i和j兩個變數了,怎麼定義指標,不用我教你了吧。其實你不用死掌握概念,會寫程式,懂得用法了,就行了。

4.不可以使用任意個星號,我曾經也是想象力很豐富,後來改掉了這個習慣,不再想象。

5.希望對你有幫助,回答不正確的地方,請樓主海涵。

另外,希望樓主多看課本,多寫程式,這樣才會有豐富的經驗。

C語言指標與二維陣列求解,c語言中二維陣列的指標如何表示

假設a是乙個二維陣列,則一 a是第乙個一維陣列名,陣列名 就是該陣列的 首位址!二 a 0 和 a都表示這個一維陣列第乙個元素的內容 這句話有問題,應該是 都表示這個 二維陣列 第乙個元素的內容!三 a和a好像不等價啊?關於陣列名和 陣列名書上有明確的介紹與說明 a a a 0 a 0 這是規定!細...

二維陣列名和指標的關係,C語言中陣列名和指標的區別

二維陣列名即陣列地址,指向首行地址,表面上看,行地址即一維陣列指標,而陣列名指向行就應該是指標的指標,但是必須注意指標也是有型別的,型別不同資料寬度也不同。如果a 10 10 假設int p a 那麼要對行遞增執行p 時,編譯器如何知道列寬?因為int 是指指向一個 int 型別的指標,32位系統中...

C語言中「二維陣列行指標」是什麼意思

陣列名就是乙個指標常量,它代表陣列元素在記憶體相關資訊。1 c語言 是一門通用計算機程式語言,應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯 處理低階儲存器 產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。2 c語言的發明 20世紀60年代,美國at t公司貝爾實驗室 at t...