1 of 17

指標

pointer

2 of 17

指標是什麼?

指標變數:儲存變數的記憶體位置(指標)的變數

3 of 17

指標是什麼?

4 of 17

指標變數是什麼?

5 of 17

指標變數宣告

6 of 17

指標變數宣告

&:取得變數的位址

7 of 17

指標變數的使用

*:取得指標變數指向的變數內容

(間接取值)

&:取得變數的位址

8 of 17

指標變數的應用

副程式的a, b交換了,但主程式中的沒有換

9 of 17

指標變數的應用

副程式的參數使用指標變數,得到主程式中變數a, b的位址

使用*(間接取值)來改變主程式中的a, b

10 of 17

傳值呼叫 VS 傳址呼叫

傳值呼叫

傳址呼叫

只把a, b的內容(值)傳(複製)給副程式

把a, b的位址傳給副程式

副程式只把複製來的內容交換

沒有交換原來主程式中的a, b

把複製來的a, b的內容放在副程式的a, b

把傳來的a, b的位址放在指標變數內

用*從指標變數內的位址

找到主程式中的a, b做交換

相當於做到回傳多個數值

11 of 17

陣列參數

不用加 &

成功在副程式給陣列指定內容(賦值)

不用加 *,也沒有陣列大小

陣列大小需另外再傳一個參數

12 of 17

k161: 分數相加

輸入說明:

輸入四個正整數 a1、a2、b1、b2,代表兩個分數 a1/a2、b1/b2 的分子與分母。

輸出說明:

請你計算出它們的和,將之以帶分數的形式,如 c+d/e 的格式印出這個結果( c、d、e 都是整數),其中 c 為整數部分,而 d/e 必須化成最簡分數(不必考慮 d 為 0 的情況)。

輸入範例1:

輸入1:

1 2 1 3

輸出1:

0+5/6

輸入範例2:

輸入2:

2 3 5 6

輸出2:

1+1/2

13 of 17

k161: 分數相加

void add(int a1, int a2, int b1, int b2, int *c1, int *c2){

int gcd_c;

*c1 = a1 * b2 + a2 * b1;

*c2 = a2 * b2;

gcd_c = gcd(*c1, *c2);

*c1 = *c1 / gcd_c;

*c2 = *c2 / gcd_c;

}

14 of 17

k212: 月刊期數(二)

本期102年8月是第145期

輸入說明:

輸入一個正整數 N ( 1<=N<=145 ) 代表月刊的期數。

輸出說明:

請印出這本月刊發行的年和月,中間請空一格。

輸入範例1:

輸入1:

145

輸出1:

102 8

輸入範例2:

輸入2:

135

輸出2:

101 10

15 of 17

k212: 月刊期數(二)

int MonthNum(int year, int month){

return year * 12 + month;

}

int NumtoYearMonth(int num, int *year, int *month){

*year = num / 12;

*month = num % 12;

}

void VoltoYearMonth(int vol, int *year, int *month){

}

16 of 17

k235: 叫我第二名

輸入說明:

先輸入一個正整數 N (3<=N<=10) ,代表該班有 N 位同學,接下來有 N 個 0~100 的整數,代表這 N 位同學的成績(未按照成績高低排序)。

輸出說明:

請你找出第二高分的成績,也就是小亮亮的分數,然後把它印出來(不用考慮分數重覆的問題)。

輸入範例1:

輸入1:

3 10 20 30

輸出1:

20

輸入範例2:

輸入2:

5 60 80 70 90 50

輸出2:

80

17 of 17

k235: 叫我第二名

int FindMaxIndex(int score[], int n){

}

int main(){

int n, score[10];

cin >> n;

for(int i=0;i<n;i++){

cin >> score[i];

}

score[FindMaxIndex(score, n)] = 0;

cout << score[FindMaxIndex(score, n)];

return 0;

}