16.1 指標運算與陣列 - About Jun Wu - 國立屏東大學

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

在C語言中,因為陣列是記憶體中連續的一塊空間,因此我們也可以透過指標來存取儲存在陣列中的資料。

本章將說明如何使用指標來存取陣列中的元素,並進一步探討指標與 ... 跳至內容 JunWu的教學網頁國立屏東大學資訊工程學系CSIE,NPTU 使用者工具 登入 網站工具 搜尋 工具輸出PDF檔案多媒體管理器網站地圖登入> 多媒體管理器網站地圖 足跡:•pointersarrays c:pointersarrays 目錄表 16.指標與陣列 16.1指標運算與陣列 16.2以指標走訪陣列 16.3指標與陣列互相轉換使用 16.4常見的陣列處理 16.5以陣列做為函式的引數 16.6指標與多維陣列 國立屏東大學資訊工程學系程式設計(二) 16.指標與陣列 在C語言中,因為陣列是記憶體中連續的一塊空間,因此我們也可以透過指標來存取儲存在陣列中的資料。

本章將說明如何使用指標來存取陣列中的元素,並進一步探討指標與陣列的關係。

16.1指標運算與陣列 考慮以下的程式碼: intdata[10]={1,2,3,4,5,6,7,8,9,10};   inti;   printf("dataat%p.\n",data); for(i=0;i<10;i++) { printf("data[%d]at%p.\n",i,&data[i]); } 其執行結果為: dataat0x7fffb0aad1e0. data[0]at0x7fffb0aad1e0. data[1]at0x7fffb0aad1e4. data[2]at0x7fffb0aad1e8. data[3]at0x7fffb0aad1ec. data[4]at0x7fffb0aad1f0. data[5]at0x7fffb0aad1f4. data[6]at0x7fffb0aad1f8. data[7]at0x7fffb0aad1fc. data[8]at0x7fffb0aad200. data[9]at0x7fffb0aad204. 上述的程式碼宣告並在記憶體內配置了一塊連續十個整數的陣列,並且將其位址配置印出。

由於陣列是連續的空間配置,在上面的例子中,data位於0x7fffb0aad1e0,那麼其第一筆資料(也就是data[0])就是位於同一個位址,或者更詳細的說,是從0x7fffb0aad1e0~3,這四個記憶體位址。

由於一個位址代表一個byte,四個bytes就剛好表示一個32位元的整數。

其後的每筆資料也都剛好間隔4個bytes。

我們可以用一個指標指向陣列的第一筆資料: int*p;   p=&data[0];   或是   p=data;   或者   p=&data;//這行會有編譯的警告,因為p應該要指向一個整數,但data其實只是一個陣列所在的記憶體位址   p=(int*)&data;//這樣就沒問題了 上述的程式碼宣告了一個整數指標p指向陣列所在之處,如figure 1。

Fig.1 我們可以透過「*p」來存取data[0]的數值資料。

如果我們要使用指標p來存取陣列中別的元素,例如第3筆資料(也就是data[2]),則可以用: printf("%d\n",*(p+2));//這行程式中的*(p+2)就等於data[2]; 考慮到p目前指向的是0x7fffb0aad1e0,也就是data[0]所在的位址。

p+2並不會等於0x7fffb0aad1e0+2,而是等於0x7fffb0aad1e0+2*sizeof(int),因為操作的對象p是一個指向整數的指標,因此若對它進行加法的運算,其運算單位是以整數的大小為依據,所以p+2會等於0x7fffb0aad1e8,這也就是data[2]所在的位址。

指標除了可以進行加法的運算外,也可以進行減法的運算: int*p; int*q;   p=&data[5]; q=p-2;//q現在指向data[3] p-=3;//p現在指向data[2] 前面提到,指標的運算是以其參考型態的大小為依據。

當運算元皆是指標時,其運算結果也是會轉換為其參考型態的大小間的差距: inti; p=&data[5]; q=&data[2];   i=p-q;//i的值為3 i=q-p;//i的值為-3 指標還可以使用relationaloperators(包含=,>,!=)進行比較,依指標值其比較結果可以為0(不成立時)或1(條件成立時)。

p=&data[5]; q=&data[2];   if(p>q) printf("Thepositionofpisafterthatofq.\n"); if(*p>*q) printf("Thevalueofpislargerthanthatofq.\n"); 16.2以指標走訪陣列 下面的程式,配合迴圈的使用,利用指標來將陣列中每個元素都拜訪一次: #include   intmain() { intdata[10]={1,2,3,4,5,6,7,8,9,10};   inti; int*p;   p=&data[0]; for(i=0;i<10;i++) printf("data[%d]=*(p+%d)=%d\n",i,i,*(p+i));   return0; } 當然,我們也可以直接用指標來操作: #include   #defineSize10   intmain() { intdata[Size]={1,2,3,4,5,6,7,8,9,10};   inti; int*p;   p=&data[0]; for(p=&data[0];p   #defineSize10   intmain() { intdata[Size]={1,2,3,4,5,6,7,8,9,10}; inti;   for(i=0;i   #defineSize10   intmain() { intdata[Size]={1,2,3,4,5,6,7,8,9,10};   inti; int*p; intsum=0,sum2=0;   for(p=&data[0];p=(int*)&data) { sum2+=*p--; } printf("sum2=%d\n",sum2);   return0; } #include   #defineSize10   intmain() { intdata[Size]={321,432,343,44,55,66,711,84,19,610};   inti; int*p; intmax,max2;   max=*(p=&data[0]); for(;p   #defineSize10   intmain() { intdata[Size]={3451,25,763,3454,675,256,37,842,3439,510};   int*p,*q;   for(p=&data[0];p   #defineROW3 #defineCOL5   intmain() { intdata[ROW][COL];   inti,j;   for(i=0;i0) printf(","); printf("%3d",data[i][j]); } printf("\n"); }   return0; } 在這個例子中,我們宣告了一個ROWxCOL(3×5)的二維陣列,給定其初始值後將陣列內容輸出。

一般而言,我們可以將二維陣列視為一個二維的表格,如figure 2所示。

Fig.2 我們可以宣告一個指標,來存取這個二維陣列,例如: int(*p)[COL];   i=0;   for(p=&data[0];p



請為這篇文章評分?