1樓:匿名使用者
對於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");}
2樓:用言文
正如樓下所言 int **p ,定義的p是一個指向int*型的指標
int (*p)[10]是一個指向陣列的指標 陣列長度為10
假如定義成 deal(int **p),傳引數時要加強制型別轉換: deal((int**)a);
並且使用p時不能用下標,p[2][3]是錯誤的,因為不知道p指向的int*型的長度,無法編譯成*(p+2*10+3)
必須自己寫成*(p+2*10+3)來呼叫
假如定義成 deal(int (*p)[10])就不一樣了,編譯器就能知道p是一個指向長度為10的陣列的指標
那麼p[2][3]就能編譯成*(p+2*10+3)了
總之,c語言是很靈活的,不同的定義方式配上不同的用法,都是能得到正確的結果的
不知道這麼說樓主明白了沒?
同樣的還有多維陣列對多維指標的問題,樓主可以自己類推一下
3樓:
程式中有些問題:
1、函式的定義有錯誤(引數格式不對);
2、程式中沒有呼叫函式(或者說是呼叫格式有誤)3、函式中的處理邏輯需要修改(一步一步來,這樣容易處理和理解)。
你定義的函式是使用陣列作為引數的,陣列名本身就是個地址(相當於指標)。
下面在手機上用易歷知食軟體裡的微c程式設計來演示修正後的**並執行程式,供參考。
手機上修正後的**如下圖:
手機上執行的效果如下圖所示:
c語言中二維陣列的指標如何表示
4樓:夜禮服假面
二維陣列和指標
⑴ 用指標表示二維陣列元素。
要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。
一個二維陣列在計算機中儲存時,是按行儲存的,即先儲存第一行的元素,再儲存第二行的元素。
當把每一行看作一個整體,即作為一個大的陣列元素時,原來的二維陣列也就變成一個一維陣列了。而每個大陣列元素對應原來二維陣列中的一行,稱為行陣列元素,顯然每個行陣列元素都是一個一維陣列。
下面討論二維陣列元素和指標之間的對應關係,清楚了二者之間的關係,就能用指標處理二維陣列了。
設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語言二維陣列
不是。這麼說吧,陣列名本身就是指標,指向陣列的第一個元素。至於你所說的呼叫呼叫二級 二維吧 陣列,難道不是如普通變數般直接呼叫嗎?根據問題補充說,這是不允許的,main 函式的形參是固定的不能傳遞指標。而一般的自定義函式只能用傳遞首地址的形式來傳遞二維陣列,例子如下 定義 int a x y int...
C 中如何在二維陣列中查詢某個值
折柳成萌 思路 先定義一個字元陣列,接著輸入字串賦值,輸入需要查詢的字元,遍歷字元陣列,查詢輸入的字元,如果找到停止遍歷輸出位置,如果遍歷結束還沒找到,輸出沒有找到。參考 參考 includeusing namespace std int main if i strlen ch cout 沒有找到!...
c中如何向二維陣列整行賦值,C 中如何向二維陣列整行賦值?
tn瓶邪 方法是在一對大括號中,使用一個以逗號分隔的資料項列表。清單2 30宣告瞭一個字串陣列,然後在一對大括號中指定了9種不同的程式語言的名稱。宣告陣列的同時進行賦值 string languages 在這個以逗號分隔的列表中,第一項成為陣列的第一個元素,第二項成為第二個元素,依此類推。我們使用大...