怎麼用指標的指標指向二維陣列的每個元素

2022-03-02 06:36:31 字數 5595 閱讀 2766

1樓:趙哲郎曉蘭

通過二級指標去訪問二維陣列需要先給二級指標分配等同於二維陣列行數的一維陣列指標,然後把二維陣列的每行首地址賦值給對應位置的一維指標上。之後就可以通過二維指標直接訪問了。

2樓:風若遠去何人留

比如整型二維陣列, 先定義int **p

然後 根據行數,申請和行數相同的int *指標每個指標指向二維陣列對應行。

這樣就可以通過每行的首地址,訪問該行所有元素了。

3樓:匿名使用者

對於a[i][j](二維陣列的大小為n×m)而言,

首先要搞清楚行指標和列指標

行指標:&a[i]或者a+i指向行,&a[i]=&*(a+i)=a+i

列指標:a[i]或*(a+i)指向列,a[i]等價於*(a+i)

元素的引用方式有如下三種方式

1.通過地址引用二維元素

*(&a[i][j]),

*(a[i]+j),

*(*(a+i)+j),

*(a[0]+m*i+j)

*(&a[0][0]+m*i+j)

(*(a+i))[j]

2.建立一個指標陣列引用二維元素

int *p[3],a[3][2],i,j;

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

p[i]=a[i];//p[i]用來存放地址,a[i]為列地址

等價如下

(1) *(p[i]+j) 與*(a[i]+j)對應

(2)*(*(p+i)+j) 與*(*(a+i)+j)對應

(3)(*(p+i))[j] *(p[i]+j) 與*(a[i]+j)對應

(4)p[i][j] 與a[i][j]對應

3.建立一個行指標引用二維陣列元素

int a[3][2],(*p)[2];

p=a;

(1) *(p[i]+j) 與*(a[i]+j)對應

(2)*(*(p+i)+j) 與*(*(a+i)+j)對應

(3)(*(p+i))[j] 與(*(a+i))[j]對應

(4)p[i][j] 與a[i][j]對應

例題如下

1.#include

main()

,,};

int i,j;

printf("輸入學生號:0-2");

scanf("%d",&i);

printf("the score of no.%d are:\n",i);

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

printf("%d\t",*(*(score+i)+j));//score+i為列指標,*(score+i)為行指標

printf("\n");

} 2.

#include

main()

;int *p;

for(p=a[0];p

main()

,,};

int i,j;

printf("輸入學生號:0-2");

scanf("%d",&i);

printf("the score of no.%d are:\n",i);

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

printf("%d\t",*(score[i]+j));

printf("\n"); } 4

#include

main()

,,};

int i,j,*p;

printf("輸入學生號:");

scanf("%d",&i);

printf("the score of no.%d are:\n",i);

for(p=score[i];p

main()

,,};

int i,j,*p;

printf("輸入學生號:");

scanf("%d",&i);

printf("the score of no.%d are:\n",i);

for(p=score[i],j=0;j<4;j++)

printf("%d\t",*(p+j));

printf("\n"); } 6

#include

main()

,,};

int i,j,(*p)[4];//指標變數p指向包括4個整型元素的一維陣列;

p=score;//p指向二維陣列0行元素,p+1所指向的元素是p所指向元素的下一行元素;

printf("輸入學生號:0-2");

scanf("%d",&i);

printf("the score of no.%d are:\n",i);

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

printf("%d\t",*(*(p+i)+j));//p+i指向第i行,p是行指標,*(p+i)指向第i行0列元素,是列指標。*(p+i)+j指向第i行j列元素,是一個元素的地址

printf("\n");}

指向二維陣列的指標

4樓:小舅舅有點帥

int(*p)[10]定義了一個指向二維陣列的指標p,賦給它10個長度,把a陣列的值賦給(*p)[10]。

注意,這裡是a陣列是5行10列的,放入(*p)[10]是把a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9]放入(*p)[0]中,同理,將a[1][0...9]放入(*p)[1]。

最後(*p)[10]中的值只有五行被初始化為a陣列的值了。

在本例中,p和p[0]是同一個意思,就是陣列a的起始地址,等價於cout

#include

#include "iostream"

using std::cout;

using std::endl;

using std::hex;

void main()

int a[5][10]=;

int (*p)[10]=a;

cout

0012feb8

0012feb8

#include

#include "iostream"

using std::cout;

using std::endl;

using std::hex;

void main()

int a[5][10]=;

int (*p)[10]=a;

cout<<*p

0012feb8

這是p和p[0]的區別就體現出來了。因為*p並不是取首元素的值,它這時才相當於p[0]。那如何通過p取得首元素的值呢,很顯然,應該再加一個*操作符,如下:

cout<<**p<這時輸出結果自然就會和(*p)[0]一樣是1了。

擴充套件資料

設p是指向二維陣列a[m][n]的指標變數,則有:

int* p=a[0];//此時p是指向一維陣列的指標。p++後,p指向 a[0][1]。

如果定義int (*p1)[n];p1=a;p1++後,p1指向a[1][0];

則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:

p+i*n+j

相應的如果用p1來表示,則為*(p1+i)+j

元素a[i][j]相應的指標表示為:

*( p+i*n+j)

相應的如果用p1來表示,則為*(*(p1+i)+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]

5樓:匿名使用者

一、你的 float score 陣列定義的是:一個3行、4列的二維浮點陣列,陣列的元素為浮點數。如果你換個格式書寫就清晰了!

float score[3][4]=,,};

在呼叫的過程中,score 就是這個陣列的首地址,指向的是浮點陣列。score + 1 指向的是陣列。

二、你的 float *p 定義的是:一個指向浮點數的指標。這個是一維的。

在呼叫的過程中,float 指向的是 xx。一個浮點數字。

兩個的定義不同,所以引數傳遞過程中會出錯。

三、你的 float (*p)[4] 定義的是:一個指向含有四個元素的浮點陣列的指標。

在呼叫的過程中,float 指向的是,由四個浮點陣列成的陣列。

這時兩個定義相同,所以引數傳遞過程中沒有錯誤。

四、有個建議,你的程式書寫格式不清晰,不利於你糾錯和修改,應該儘量的清晰、明確,不建議使用簡化方式定義引數。

作為一個軟體工作者,應該儘量使程式流暢、格式清晰、易讀,這是一個軟體工作者最基本的職業素養。

格式化後,程式如下,會清晰很多:

#include

void main()

,,};

search(score,2);

} void search(float (*p)[4],int n)/*這裡的 float *p 好像有問題*/

printf("\n");}

6樓:匿名使用者

p[0]指向陣列a的起始地址

p[9]野指標

c語言怎麼用指標代替二維陣列

7樓:匿名使用者

1.設p是指向二維陣列a[m][n]的指標變數,則有:

int* p=a[0];//此時p是指向一維陣列的指標。p++後,p指向 a[0][1]。

2.如果定義int (*p1)[n];p1=a;p1++後,p1指向a[1][0];

則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:

p+i*n+j, 相應的如果用p1來表示,則為*(p1+i)+j。

元素a[i][j]相應的指標表示為:

*( p+i*n+j) ,相應的如果用p1來表示,則為*(*(p1+i)+j)。

同樣,a[i][j]也可使用指標下標法表示,如p[i*n+j]。

若有: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]

關於二維陣列和指標

p 10的值並不是未定義,正像你說的那樣把2維陣列看成一維陣列,首先將p指向這個一維陣列的首地址,而這個一維陣列的長度是20,也就是說當你p 10的時候指向的是b這個字元上,當你執行的時候會顯示beijing 陣列實際儲存時是按照線形連續儲存的。所謂一維陣列,二維陣列,三維陣列只是為了方便理解和使用...

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語言二維陣列與指標運算

在 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 int p 4 a 表示指向一維陣列 4列 的指標,然後a 0 地址給了p,p i就表示a i 的地址....