16.1 指標運算與陣列 - About Jun Wu - 國立屏東大學
文章推薦指數: 80 %
在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
一般而言,我們可以將二維陣列視為一個二維的表格,如figure 2所示。
Fig.2
我們可以宣告一個指標,來存取這個二維陣列,例如:
int(*p)[COL];
i=0;
for(p=&data[0];p
延伸文章資訊
- 1指標與陣列
在宣告陣列之後,使用到陣列變數時,會取得首元素的位址,例如在下面的程式中將指出,陣列 arr 與 &arr[0] 的值是相同的: #include <stdio.h> int main(void...
- 216.1 指標運算與陣列 - About Jun Wu - 國立屏東大學
在C語言中,因為陣列是記憶體中連續的一塊空間,因此我們也可以透過指標來存取儲存在陣列中的資料。本章將說明如何使用指標來存取陣列中的元素,並進一步探討指標與 ...
- 3(C) 簡單搞懂指標(pointer)、指標陣列(pointers of array, int *foo ...
指標(pointer)就是一個變數的記憶體的地址,在宣告的時候使用"*"放在變數型態之後。他可以被視為一種資料型別的修飾,因此若宣告了一個指標變數時,就代表 ...
- 4指標與陣列
Part 1 C 程式語言篇. 32. 指標其實就是一位址。陣列的名稱,表示此陣列第一個元素的位址,所. 以它也是指標。由此可知,指標與陣列的關係是很密切的。為了與指標.
- 5重新看懂指標與陣列之間的交互關係
C 語言中,指標與陣列之間的關係一直是一個初學者很難理解的坑。 ... 陣列的變數名稱其實就是一個指標,指向陣列開頭元素的記憶體位置。