# 第一題
Ans: 16, 9, 17, 5, 11, 17
void f3(int** pp, int** qq, int a[], int* p) { | |
int** rr = qq; | |
a[0] = (**rr) + (*(a + 2)); | |
printf("%d\n", a[0]); | |
*pp = p + 1; | |
*rr = *pp + 1; | |
printf("%d\n", *(*rr + 2)); | |
*(a + 1) = (**pp) + a[*p - 1]; | |
printf("%d\n", a[1]); | |
*qq = p; | |
*((*qq) + 1) = (**rr) + (**pp); | |
printf("%d\n", **qq); | |
} | |
void test3() { | |
int a[] = { 5, 6, 7, 8, 9, 10, 11 }; | |
int* p = a, * q = a + 2; | |
int** pp = &p; | |
f3(pp, &q, a + 2, p); | |
printf("%d\n", a[1]); | |
printf("%d\n", a[3]); | |
} |
- 在 test03 一開始的時候會有這樣。
- 呼叫 f3 的時候會有區域變數,而因為變數會有重複到,因此在 f3 () 裡面的我就外加一個小 t 以做表示指向的 test03 ()
void f3(int** pp, int** qq, int a[], int* p)
a[0] = (**rr) + (*(a+2));
**rr = 7 | |
*(a+2) = *((&a[0]_t + 2) + 2)= *(a_t+4) = 9// 這邊的 *(a+2) 是指 f3 ()。 後面的 a 是 test03 ()。 | |
a[0]_t = 16; |
此時的表為如下:
*pp = p + 1; *rr = *pp + 1; printf("%d\n", *(*rr + 2)); //9
執行完成會變成如下:
*pp = &a[0]_t + 1 = &a[1]_t; | |
*rr = &a[0]_t + 2; | |
*(*rr + 2) = 9; |
*(a + 1) = (**pp) + a[*p - 1]; printf("%d\n", a[1]); //17
執行完成會變成如下:
**pp = *(&a[0]_t + 1) = 6; | |
*p = *(&a[0]_t) = 5; | |
a[5 - 1] = a[4] = a[6]_t = 11 | |
// 因為題目給的 a 是 f3 的 &a [0] + 2, 因此當我們換算成 test03 () 的 a 陣列時,要在加上偏移 +2。 | |
*(a+1) = *((&a[0]_t + 2) + 1) = *a[3] <= 6 + 11; |
*qq = p; *((*qq) + 1) = (**rr) + (**pp); printf("%d\n", **qq); //5
執行完成會變成這樣:
*qq = q_t = &a[0]_t | |
**rr = *(&a[0]) = 5 | |
**pp = *(&a[0]+1) = 6 | |
*((*qq)+1) = *(&a[0]_t + 1) = a[1]_t | |
**qq = 5 |
printf("%d\n", a[1]); printf("%d\n", a[3]); //11, 17
# 第二題
Ans : (1) 3 (2) 1 (3) 1 (4) 1 (5) 76,20 (6) 20,16
(7) 4
void f51(int* s, int p[][2]) { *s = p[1][0]; } | |
int f52(int a[], int n) { | |
if (n >= 0) { | |
printf("%d\n", a[n]); | |
return (f52(a, n - 1) + a[n]); | |
} | |
else return 0; | |
} | |
int f53(int m, int n) { | |
if (m % n == 0) return n; | |
else { | |
printf("%d, %d\n", m, n); | |
return f53(n, m % n); | |
} | |
} | |
void test5() { | |
int result; | |
int b[] = { 0, 1, 3, 4, 5 }; | |
int a[2][2] = { 4, 3, 1, 0 }, * p; | |
p = &b[2]; | |
printf("%d\n", *(p)); | |
f51(p, a); p = &b[1]; result = f52(p, b[1]); | |
printf("%d\n", *p); | |
printf("%d\n", f53(76, p[2] + 16)); | |
} |
f51(p,a); void f51(int* s, int p[][2]) { *s = p[1][0]; }
p = &b[1];
- 如下
int f52(int a[], int n) { | |
if (n >= 0) { | |
printf("%d\n", a[n]); //1 , 因為 a [1]=b [2]=1 | |
return (f52(a, n - 1) + a[n]); // 由 6. 可以知道回傳值為 f52 (a, 0) + a [1] = 1 + 1 = 2 | |
} | |
else return 0; | |
} |
printf("%d\n", a[n]); //1
return (f52(a, n - 1) + a[n]);
– 開始進入遞迴的部分。- 如下
int f52(int a[], int n) { | |
if (n >= 0) { | |
printf("%d\n", a[n]); //a [0] = 1, 因為 a [0] = b [1] = 1 | |
return (f52(a, n - 1) + a[n]); | |
// 由 8. 可以知道 f52 (a, n - 1) = 0 | |
// f52(a, n - 1) + a[n] = 0 + 1 = 1 | |
} | |
else return 0; | |
} |
return 0;
– 此時 n = -1, 回傳 0
- 回到
6.
步驟 並回傳 0。
int f52(int a[], int n) { | |
if (n >= 0) { | |
printf("%d\n", a[n]); //a [0] = 1, 因為 a [0] = b [1] = 1 | |
return (f52(a, n - 1) + a[n]); | |
// 由 8. 可以知道 f52 (a, n - 1) = 0 | |
// f52(a, n - 1) + a[n] = 0 + 1 = 1 | |
} | |
else return 0; | |
} |
- 此時我們看
test05()
的result = f52(p, b[1]);
, 此時 result = 2。 printf("%d\n", f53(76, p[2] + 16));
int f53(int m, int n) { | |
if (m % n == 0) return n; | |
else { | |
printf("%d, %d\n", m, n); | |
return f53(n, m % n); | |
} | |
} |
printf("%d, %d\n", m, n);
會印出76, 20
。並跑到f53(n,m % n)
。printf("%d\n", f53(20, 16));
–14.
可以知道回傳值為 4。
int f53(int m, int n) { | |
if (m % n == 0) return n; | |
else { | |
printf("%d, %d\n", m, n); | |
return f53(n, m % n); | |
} | |
} |
printf("%d, %d\n", m, n);
-- 會印出20, 16
。並跑到f53(n,m % n)
。printf("%d\n", f53(16, 4));
-- 此時滿足if (m % n == 0) return n;
,所以回傳 4。並回到12.
步驟。
int f53(int m, int n) { | |
if (m % n == 0) return n; | |
else { | |
printf("%d, %d\n", m, n); | |
return f53(n, m % n); | |
} | |
} |
# 第三題
(1) 6, 9 (2) 15, 9 (3) 15, 3
(4) 2, 9 (5) 3, 6 (6) 9, 6 (7) 6, 1, 9
void f41(int* p, int* q, int* r) { | |
int** pp = &p, ** qq = &q, ** rr = &r; | |
q = r; r = p; *p += 1; *q = *r + 3; | |
printf("%d, %d\n", *p, *q); | |
qq = &p; *rr = q; **qq = *r + **pp; | |
printf("%d, %d\n", **qq, **rr); | |
} | |
void f42(int a[], int p1, int* p2, int* p3) { | |
a[0] = 0; p1 = 1; *p2 = 2; p3 = a + 2; | |
} | |
void f43(int a[]) { | |
f41(&a[2], &a[1], &a[0]); | |
printf("%d, %d, %d\n", a[0], a[1], a[2]); | |
} | |
void test4() { | |
int a = 5, b = 3, c = 1, arr[] = { 1, 3, 5, 7, 9, 11 }; | |
f41(&a, &b, &c); | |
printf("%d, %d\n", a, b); | |
arr[0] = 0; arr[1] = 1; arr[2] = 2; arr[3] = 3; arr[4] = 4; | |
f42(arr, a, &b, &c); | |
printf("%d, %d\n", b, c); | |
arr[0] = 0; arr[1] = 1; arr[2] = 2; arr[3] = 3; arr[4] = 4; | |
f43(arr); | |
} |
f41(&a, &b, &c);
– 此時 a = 5, b = 3, c = 1。f41(int* p, int* q, int* r)
– 此時 p = &a, q = &b, r = &c。
q = r; r = p; *p += 1; *q = *r + 3;
printf("%d, %d\n", *p, *q);
– 6, 9
qq = &p; *rr = q; **qq = *r + **pp;
- 回到
test04()
,printf("%d, %d\n", a, b);
– 15, 3 f42(arr, a, &b, &c);
void f42(int a[], int p1, int* p2, int* p3) {
a[0] = 0; p1 = 1; *p2 = 2; p3 = a + 2;
printf("%d, %d\n", b, c);
– bytest04()
2, 9arr[0] = 0; arr[1] = 1; arr[2] = 2; arr[3] = 3; arr[4] = 4; f43(arr);
void f43(int a[]) { | |
f41(&a[2], &a[1], &a[0]); | |
printf("%d, %d, %d\n", a[0], a[1], a[2]); | |
} |
f41(&a[2], &a[1], &a[0]);
void f41(int* p, int* q, int* r) {
q = r; r = p; *p += 1; *q = *r + 3; | |
printf("%d, %d\n", *p, *q); |
從
2.
可以推出來 他會把第一個位置+1
,第二個位置 不變
,第三個位置= 第一個位置 + 3
。,
qq = &p; *rr = q; **qq = *r + **pp; | |
printf("%d, %d\n", **qq, **rr); |
把
第一個位置 = 第一個位置 + 第三個位置
。並輸出 第一,第三的位置。
printf("%d, %d, %d\n", a[0], a[1], a[2]);