指標與陣列

文章推薦指數: 80 %
投票人數:10人

在宣告陣列之後,使用到陣列變數時,會取得首元素的位址,例如在下面的程式中將指出,陣列 arr 與 &arr[0] 的值是相同的: #include int main(void) { int ... 回C語言目錄 在宣告陣列之後,使用到陣列變數時,會取得首元素的位址,例如在下面的程式中將指出,陣列arr與&arr[0]的值是相同的: #include intmain(void){ intarr[10]={0}; printf("arr:\t\t%p\n",arr); printf("&arr[0]:\t%p\n",&arr[0]); return0; } 執行結果: arr:0061FEA8 &arr[0]:0061FEA8 之前也曾經談過,陣列索引其實是相對於首元素位址的位移量,下面這個程式以指標運算與陣列索引操作,顯示出相同的對應位址值: #include #defineLEN10 intmain(void){ intarr[LEN]={0}; int*p=arr; for(inti=0;i #defineLEN5 intmain(void){ intarr[LEN]={10,20,30,40,50}; int*p=arr; //以指標方式存取 for(inti=0;i intmain(void){ intarr[]={10,20,30,40,50}; printf("%p\n",arr);//顯示0061FEBC printf("%p\n",&arr);//顯示0061FEBC return0; } 每個陣列元素的位址型態是int*,這表示對它進行運算時,是以int長度為單位,而arr變數的位址處就是陣列資料的開端,&arr型態會是…呃…int(*)[5],5是陣列長度,如果想宣告相對應的變數,可以如下: int(*p)[5]=&arr; int(*)[5]表示,對它進行運算時,是以5個int長度為單位,因此&arr+1的結果,會是陣列使用的空間後之位址,而*(&arr+1)的值型態會回到int*,也就是最後一個元素後之位址,這時就可以與int*的arr進行相減,也就是與第一個元素之位址相減,就可以得到陣列長度了。

舉這個例子的重點之一是,對於同一個位址,指標的型態決定了該怎麼看得相對應相加、相減計算;另一個重點是,透過陣列變數會取得首元素的位址,將陣列變數指定給指標p,就只是取得首元素位址並儲存在p,如果將p傳給sizeof,那使用的會是指標p的型態,而不是原陣列的型態,這會令sizeof、以及方才那神奇計算長度的方式失效,例如: #include intmain(void){ intarr[]={10,20,30,40,50}; int*p=arr; printf("%p\n",p);//顯示0061FEBC printf("%p\n",&p);//顯示0061FEB8 printf("%d\n",sizeof(p)/sizeof(*p));//顯示1 printf("%d\n",*(&p+1)-p);//顯示-1605549 return0; } C++11提供了begin與end函式,可以計算陣列長度: constexprintLENGTH=5; intarr[LENGTH]={10,20,30,40,50}; cout< intmain(void){ intarr[]={10,20,30,40,50}; int*begin=arr; int*end=*(&arr+1); for(int*it=begin;it #defineROWS2 #defineLEN3 intmain(void){ intmaze[ROWS][LEN]={ {1,2,3}, {4,5,6} }; printf("ROWS:%d\n",sizeof(maze)/sizeof(maze[0])); printf("LEN:%d\n",sizeof(maze[0])/sizeof(maze[0][0])); return0; } 或者是使用以下程式: #include #defineROWS2 #defineLEN3 intmain(void){ intmaze[ROWS][LEN]={ {1,2,3}, {4,5,6} }; printf("ROWS:%d\n",*(&maze+1)-maze); printf("LEN:%d\n",*(&maze[0]+1)-maze[0]); return0; } 執行結果都是: ROWS:2 LEN:3 〈二維(多維)陣列〉也曾經舉了個例子: #include #defineROWS2 #defineLEN3 intmain(void){ intmaze[ROWS][LEN]={ {1,2,3}, {4,5,6} }; for(inti=0;i #defineROWS2 #defineLEN3 intmain(void){ introw1[LEN]={1,2,3}; introw2[LEN]={4,5,6}; int*maze[ROWS]={row1,row2}; for(inti=0;i #defineROWS2 #defineLEN3 intmain(void){ intmaze[ROWS][LEN]={ {1,2,3}, {4,5,6} }; for(inti=0;i #defineROWS2 #defineLEN3 intmain(void){ intmaze[ROWS][LEN]={ {1,2,3}, {4,5,6} }; int(*mazeBegin)[LEN]=maze; int(*mazeEnd)[LEN]=*(&maze+1); for(int(*row)[LEN]=mazeBegin;row #defineROWS2 #defineLEN3 typedefint(*Row)[LEN]; intmain(void){ introw1[LEN]={1,2,3}; introw2[LEN]={4,5,6}; Rowmaze[ROWS]={&row1,&row2}; introws=*(&maze+1)-maze; for(inti=0;i



請為這篇文章評分?