c語言二維陣列與指標運算,C語言二維陣列與指標運算

2021-05-04 18:26:52 字數 5010 閱讀 4166

1樓:

在(*p)[4]中p是指向一個有4 個int元素的一維陣列的首地址,int (*p)[4]=a就相當於int (*p)[4];p=a;兩個語句,所以*(p+i)指向i行地址,*((*p+i)+c)指向i行c列的地址即a[i][c]。

2樓:匿名使用者

int (*p)[4]=a;表示指向一維陣列(4列)的指標,,然後a【0】地址給了p,p+i就表示a【i】的地址.而*(p+i)+c就表示了a[i]的第c個地址,

3樓:理科女

首先看main裡定義了一個整形的二維陣列a,和整形變數i,和一個指向陣列的指標 (*p)[4]並把a賦值給了它,然後一個for迴圈,只能迴圈3次 0,1,2.

然後輸出*(*(p+i)+c)

首先*(p+i)就意味著訪問第i行的陣列就是p [1][4]由於巨集定義了#define c 2 c=2,所以就是取值後加2 就變成了p[3][4]

在取值 結果就是8

4樓:匿名使用者

1.int (*p)[4],表示定義一個陣列指標。例:

int (*p)[10]; p即為指向陣列的指標,又稱陣列指標。陣列指標是指向陣列首元素的地址的指標,其本質為指標;指標陣列是陣列元素為指標的陣列(例如 int *p[3],定義了p[0],p[1],p[2]三個指標),其本質為陣列。陣列指標的使用在某些情況下與指標陣列很相似,要注意區別。

2.*(p+i)=a[i]

3.*(*(p+i)+c)=a[i][c]4.這個程式的結果為:35

7要注意「\n」表示換行

呵呵,希望對你有幫助

c語言中如何用指標運算子來表示一個二維陣列的元素及地址?

5樓:匿名使用者

首先你得知道a就是陣列第一個元素的地址,而二維陣列a[i][j]可以理解為a[i]陣列每個元素儲存的是一個j個元素大小的另一個陣列,這樣理解的話,先說*(*(a+i)+j),a+i就不說了相當於被過載操作符一樣,指標+1的含義就是加一個單位的資料大小,然後*(a+i)則相當於a[i]的值對吧,而a[i]的值就是下一個陣列的指標現在源**相當於*(a[i]+j),然後自己分析吧,很簡單的,不過說實話沒必要真麼糾結,真寫**沒多少人閒的蛋疼真麼寫的,給自己製造麻煩不說,後期維護也會很痛苦的

6樓:樑昌仔

二維指標,就是說第一維是指標,第二維還是指標;

拿*(*(a+i)+j)來說:a是陣列的首地址吧,然後+i,就是說a地址向後偏移i位。就是a+i的地址了,注意,這裡a+i只是地址,用*符號取出該地址的資料,就是*(a+i),這裡*(a+i)就是第一維指標,它指的是地址,不是資料。

而且後面的*(a+i)+j就是說以*(a+i)為首地址,偏移j位,然後使用*取內容,這裡就是第二維了,取到的資料就是實際資料了

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

7樓:夜禮服假面

二維陣列和指標

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

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

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

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

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

設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語言指標陣列與二維陣列行指標小問題

指標陣列 copy 該陣列中存放的全部都是指標,例如 原例子中的char name,這個是一個標準透了的一維陣列,就像是陣列 int a 4 a 1 2 a 2 3 不同的是陣列name存放的是指標,陣列a存放的是數字 name 1 name 2 表示的是把name 2 的指標賦值給name 1 就...

c語言中二維陣列下標問題,C語言中二維陣列下標問題

a可以理解為二重指標,a 0 理解指標,a 0 0 是對這個地址進行訪問了 其實回 的意義 可以理解成 a i 其實就相當於 a i 所以原答來的就相當於 a i j 的優先順序比 的高 所以外面那個括號可以去掉 就變成了 a i j 明白了嗎?這裡a指的是整個陣列,而a 0 指二維陣列第一行的元素...

C 函式呼叫二維陣列,C語言一維陣列轉二維陣列

n如果是變數的話,陣列編譯時都通不過吧。陣列分配時必須知道大小。函式應該這樣宣告function char array 10 10 或省略第一維的大小function char array 10 function char array n n 這樣是錯誤的,陣列的索引必須是個常量表示式。如果需要必須...