想向大家問關於c語言的問題 行指標與二維陣列,行指標詩歌

2021-04-02 12:48:08 字數 5728 閱讀 9426

1樓:地獄的冷槍

我們正常情bai況下例如 int a[10];int *p = a;

p指向的就是

dua陣列的首地址。

*p就是裡zhi面的第一個元

dao素。

那麼專再到二維陣列。屬

指標p指向一個二維陣列,那麼p就可以理解為指向二維陣列a的首地址。

你把二維陣列裡面的每一整行看做一個元素,即把二維陣列按照一維陣列去理解,

則*p指向二維陣列的第一行。

則**p就指向第一行的第一個元素。

c語言中,行指標指向**,為什麼(*p)[]方框裡是二維陣列的列不是行,他不是行指標嗎

2樓:

(*p)[x]只是說p是指向一個具有x列的一維陣列的指標,指標的型別(就是這個一維陣列的元素的型別)有待你宣告,x的大小也要你寫明確,否則p就不可用;p確實是行指標,是指向一行一維陣列的,但一個一維陣列的長度不是用列數來表示的嗎?至於p指向了哪一行,那要由**給它賦值了才能知道。比如有int a[3][4],(*p)[4],p=a;,那麼這時p就指向了第一行(第一下標為0的那一行),p+1就指向了第二行(第一下標為1),p+2就指向了第三行(第一下標為2)。

若沒有賦值(沒有寫p=a),那麼p就只是一個能指向列數為4的(即陣列長度為4)int型陣列的指標,它這時還是野指標,沒有具體指向!

c語言,指標,分別用行指標變數和列指標變數輸入和輸出二維陣列,行指標變數和列指標變數?我這對嗎

3樓:天天向上知識店鋪

可以的。

在c語言中,二維陣列在表示時可以有很多方法的:

如:a[i][j]可以表示為:*(a[i]+j)、*(*(a+i)+j)、(*(a+i))[j]

c語言的行指標與元素指標有什麼區別?

4樓:匿名使用者

先舉個例子吧,先定義一個二維陣列int a[3][4]=,,}陣列名a就是一個行指標,a[0]就是一個列指標;

就拿這個例子說吧,a和a[0]雖然地址相同,可是指標指向型別卻不同,對指標進行+1運算,顯然得到的結果是不同的,因此a(行指標)+1中的"1」代表一行中全部元素所佔的位元組數,而a[0]+1,這裡的1則是一個元素所佔的位元組數,是兩個不同的概念。

為了說明這個容易搞混的問題,可以用軍訓中排隊點名來說明。班長逐個檢查本班戰士是否在佇列中,班長每移動一步,走過一個戰士,而排長點名只檢查本排各各班是否到齊。排長只從第0班的起始位置走到第1個班的起始位置,看來只走了一步,但實際上他跳過了10個戰士,這相當於a+1,班長面對的戰士,排長面對的是班,班長相當對列指標,排長相當於行指標。

為了找到某個班內的某一個戰士,必須給出兩個引數

5樓:鍵盤雀躍

^int a[4]=

1 2 3 4

^ ^

a[0] a[1] a[2] a[3]a是一維陣列名,代表陣列的首地址.也就是a[0]*(a+1) 指標移動2個位元組,指向下一個陣列元素,就是a[1]int a[3][4]=,,}

^ ^

*a[4] 或a[4] 或a[3][4] 都可以表示行指標.操作a是二維陣列名,代表二維陣列的首地址,也就是a[0][0] = 1

*(a+1)[4] 指標指向a[1][0] = 5 ,也就是指向下一行陣列元素的首地址.一次跳躍到下一行.

6樓:匿名使用者

行指標與元素指標的區別實質上就是指 【陣列】與【普通指標】的區別。

區別:1、指標的本質是一個與地址相關的複合型別,它的值是資料存放的位置(地址);陣列的本質則是一系列的變數。

2、陣列名對應著(而不是指向)一塊記憶體,其地址與容量在生命期內保持不變,只有陣列的內容可以改變。指標可以隨時指向任意型別的記憶體塊,它的特徵是"可變",所以我們常用指標來操作動態記憶體。

3、當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。

7樓:匿名使用者

行指標是指向一行的,假設指標為p,那麼p++就向下移m*d(m為那一行的元素個數,d每個元素佔的記憶體單元)

指向元素的指標 p,那麼p++就是指向下一個元素

也就是說p移動的位元組不一樣

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

8樓:夜禮服假面

二維陣列和指標

⑴ 用指標表示二維陣列元素。

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

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

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

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

設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]是同一個地址,

⑵ 用二維陣列名作地址表示陣列元素。

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

對於二維陣列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

⑶ 行陣列指標

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

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

在上面的說明中已經知道,二維陣列名是指向行的,它不能對如下說明的指標變數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**型別直接賦值訪問

關於C語言的問題,關於c語言的問題?

語法錯誤咱不討論。從邏輯上,if a b else t a a b b t 應該是說,如果a b,則不操作,否則 即a b 交換a,b的值。但是注意 else下如果無大括號,則表示else內只執行第一句。所以應該為 else 下面兩句同理。可能表達不是很清楚,但你應該能看懂吧。希望對你有幫助。if後...

關於c語言的問題,求解答,關於C語言的問題,求解答!

1.d 識別符號不能以數字bai打du頭 2 d 一般c關鍵字在編譯器中zhi 會出現dao變成藍色,a不是而 define是,版b 中的printf只是一個輸出權函式,c是大寫的,不是,如果是int 就是,因為在c中,大小寫是敏感的 3 d d項轉譯成字元 4 a 0x20u的意思是無符號的16進...

關於c語言的問題,關於C語言的一個問題

include define max x,y,z x y?x y z?x y?x y z define min x,y,z x int main include int main void include include need random srandom include need time i...