Pointer: 指標(續)
ª 指標與陣列
陣列:是固定長度的記憶體區塊。
指標:是實是一種特殊的變數,用來記錄所指向變數的位址。
陣列的元素排列可以利用指標的運算來存取。
ª 指標與陣列的關係
1.陣列是利用註標取出元素值。
2.若宣告 int a[3]={5,7,9};
則指標 a,所指的是a[0]的位址。 即,
*a 和
a[0]的值是一樣的。
*(a + 1) 和
a[1] 的值是一樣的。
*(a + 2) 和
a[2] 的值是一樣的。
ª 二維陣列 vs. 雙重指標
若宣告 int num[3][3];
num[3][3]
num[0][0] *(*(num+0)+0)
num[0][1] ______________
num[0][2] ______________
num[1][0] ______________
num[1][1] ______________
num[1][2] ______________
num[2][0] ______________
num[2][1] ______________
num[2][2] ______________
ª 【練習一】:
using namespace std; int main(void) { int a[3]={5,7,9}; int i,sum=0; for(i=0; i<3; i++) sum += *(a+i); cout << "sum=" << sum << endl; return 0; } |
請畫下過程: i = 0 :
i = 1 :
i = 2 :
最後,sum = ___________ |
ª 【練習二】:利用指標,將陣列傳入函數。請寫下執行結果(並說明)
#include <iostream> using namespace std; void add(int *,int,int,int); int main(void) { int a[10]={1,2,3,4,5,6,7,8,9,10}; int i,n=3,m=8,k=5; cout << " Before process...\n array a="; for(i=0; i<10; i++) /* 印出陣列的內容 */ cout << a[i] << " "; add(a,n,m,k); /* 呼叫自訂函數add() */ cout << "\n After process...\n array a="; for(i=0; i<10; i++) /* 印出陣列的內容 */ cout << a[i] << " "; return 0; }
void add(int *ptr, int n, int m, int k) { int i; for(i=n; i<=m; i++) *(ptr+i) += k; return; }
|
執行結果:
|
ª 函數傳回值為指標型態的情況。
練習三:請Trace 結果:
#include <iostream> using namespace std; #define SIZE 5 int *maximum(int *); int main(void) { int a[SIZE]={3,1,7,2,6}; int i,*ptr;
cout << "array a="; for(i=0;i<SIZE;i++) cout << a[i] << " "; ptr=maximum(a); cout << endl; cout<< "maximum=" << *ptr; cout << endl; return 0; } |
/* 尋找並傳回陣列的最大值 */ int *maximum(int *m) { int i,*max;
max=m; for(i=1;i<SIZE;i++) if(*max < *(m+i)) max=m+i; return max; }
|
|
ª 動態配置記憶體:
一維配置:
int *ptr = new int[5]; |
二維配置:
int i; int **ptr = new int*[5]; for (i=0; i<5; i++) ptr[i] = new int[3]; |
範例一:
#include <iostream> using namespace std; int main() { int *score; int i, num, sum; float avg;
sum=0; cout << “請輸入學生人數:”; cin >> num; score = new int[num]; if (!score) { cout << “Memory allocate fail!! ” << endl; exit(1); }
for (i=0; i<num; i++) { cout << “Input English score. >>>”; cin >> score[i]; sum += *(score + i); }
avg = (float) sum / (float) num; cout << “The average is ” << avg << endl; delete score; score = NULL; system(“PAUSE”); return 0; }
|