# 第一題

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]);
}
  1. 在 test03 一開始的時候會有這樣。

a567891011\begin{array}{|c|} *a \\ \hline 5\\ 6\\ 7\\ 8\\ 9\\ 10\\ 11 \end{array}

pqpp&a[0]&a[0]+2&p\begin{array}{|c|c|c|} p & q & pp \\ \hline \&a[0] & \&a[0] + 2 & \&p \end{array}


  1. 呼叫 f3 的時候會有區域變數,而因為變數會有重複到,因此在 f3 () 裡面的我就外加一個小 t 以做表示指向的 test03 ()
    void f3(int** pp, int** qq, int a[], int* p)

ppqqaprr&pt&qt&a[0]t+2&a[0]t&qt\begin{array}{|c|c|c|c|c|} pp & qq & *a & p & rr\\ \hline \&p_t & \&q_t & \&a[0]_t + 2 & \&a[0]_t & \&q_t \\ \end{array}


  1. 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;

此時的表為如下:

a5616891011\begin{array}{|c|} *a \\ \hline 5\\ 6\\ 16\\ 8\\ 9\\ 10\\ 11 \end{array}


  1. *pp = p + 1; *rr = *pp + 1; printf("%d\n", *(*rr + 2)); //9
    執行完成會變成如下:

test03:pqpp&a[0]+1&a[0]+1&ptest03:\begin{array}{|c|c|c|} p & q & pp \\ \hline \&a[0] + 1& \&a[0] + 1 & \&p \end{array}

f3:ppqqaprrpt&qt(&a[0]t+1)+1&a[0]t&qtf3 :\begin{array}{|c|c|c|c|c|} pp & qq & *a & p & rr\\ \hline p_t& \&q_t & (\&a[0]_t + 1) + 1 & \&a[0]_t & \&q_t \\ \end{array}

*pp = &a[0]_t + 1 = &a[1]_t;
*rr = &a[0]_t + 2;
*(*rr + 2) = 9;

  1. *(a + 1) = (**pp) + a[*p - 1]; printf("%d\n", a[1]); //17
    執行完成會變成如下:

a56161791011\begin{array}{|c|} *a \\ \hline 5\\ 6\\ 16\\ 17\\ 9\\ 10\\ 11 \end{array}

test03:pqpp&a[0]+1&a[0]+2&ptest03:\begin{array}{|c|c|c|} p & q & pp \\ \hline \&a[0]+1 & \&a[0] + 2 & \&p \end{array}

f3:ppqqaprr&pt&qt&a[0]t+2&a[0]t&qtf3 :\begin{array}{|c|c|c|c|c|} pp & qq & *a & p & rr\\ \hline \&p_t & \&q_t & \&a[0]_t + 2 & \&a[0]_t & \&q_t \\ \end{array}

**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;

  1. *qq = p; *((*qq) + 1) = (**rr) + (**pp); printf("%d\n", **qq); //5

執行完成會變成這樣:

a56161791011\begin{array}{|c|} *a \\ \hline 5\\ 6\\ 16\\ 17\\ 9\\ 10\\ 11 \end{array}

test03:pqpp&a[0]+1&a[0]&ptest03:\begin{array}{|c|c|c|} p & q & pp \\ \hline \&a[0]+1& \&a[0] & \&p \end{array}

f3:ppqqaprr&pt&qt&a[0]t+2&a[0]t&qtf3 :\begin{array}{|c|c|c|c|c|} pp & qq & *a & p & rr\\ \hline \&p_t & \&q_t & \&a[0]_t + 2 & \&a[0]_t & \&q_t \\ \end{array}

*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
  1. printf("%d\n", a[1]); printf("%d\n", a[3]); //11, 17

a511161791011\begin{array}{|c|} *a \\ \hline 5\\ 11\\ 16\\ 17\\ 9\\ 10\\ 11 \end{array}


# 第二題

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));
}

bb[]aa[][]000,04110,13231,01341,1045\begin{array} {|c|c||c|c|} b&b[] &a& a[][] \\ \hline 0& 0 & 0,0 & 4 \\ 1& 1 & 0,1 & 3 \\ 2& 3 & 1,0 & 1 \\ 3& 4 & 1,1 & 0 \\ 4& 5 & \\ \end{array}

p&b[2] \begin {array} {|c|} p \\ \hline \&b[2] \\ \end{array}

  1. f51(p,a); void f51(int* s, int p[][2]) { *s = p[1][0]; }

bb[]aa[][]000,04110,13211,01341,1045\begin{array} {|c|c||c|c|} b&b[] &a& a[][] \\ \hline 0& 0 & 0,0 & 4 \\ 1& 1 & 0,1 & 3 \\ 2& 1 & 1,0 & 1 \\ 3& 4 & 1,1 & 0 \\ 4& 5 & \\ \end{array}

p&b[2] \begin {array} {|c|} p \\ \hline \&b[2] \\ \end{array}

  1. p = &b[1];

bb[]aa[][]000,04110,13211,01341,1045\begin{array} {|c|c||c|c|} b&b[] &a& a[][] \\ \hline 0& 0 & 0,0 & 4 \\ 1& 1 & 0,1 & 3 \\ 2& 1 & 1,0 & 1 \\ 3& 4 & 1,1 & 0 \\ 4& 5 & \\ \end{array}

p&b[1] \begin {array} {|c|} p \\ \hline \&b[1] \\ \end{array}

  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;
}

bb[]aa[][]000,04110,13211,01341,1045\begin{array} {|c|c||c|c|} b&b[] &a& a[][] \\ \hline 0& 0 & 0,0 & 4 \\ 1& 1 & 0,1 & 3 \\ 2& 1 & 1,0 & 1 \\ 3& 4 & 1,1 & 0 \\ 4& 5 & \\ \end{array}

a[]n&b[1]1\begin{array} {|c|c|} a[]&n \\ \hline \&b[1] & 1\\ \end{array}

  1. printf("%d\n", a[n]); //1
  2. return (f52(a, n - 1) + a[n]); – 開始進入遞迴的部分。
  3. 如下
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;
}

a[]n&b[1]0\begin{array}{|c|c|} a[] & n\\ \hline \&b[1] & 0\\ \end{array}

  1. return 0; – 此時 n = -1, 回傳 0

a[]n&b[1]1\begin{array}{|c|c|} a[] & n\\ \hline \&b[1] & -1\\ \end{array}

  1. 回到 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;
}

  1. 此時我們看 test05()result = f52(p, b[1]); , 此時 result = 2。
  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);
   }
}

mn7620\begin{array}{|c|c|} m & n\\ \hline 76 & 20\\ \end{array}

  1. printf("%d, %d\n", m, n); 會印出 76, 20 。並跑到 f53(n,m % n)
  2. 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);
   }
}

mn2016\begin{array}{|c|c|} m & n\\ \hline 20 & 16\\ \end{array}

  1. printf("%d, %d\n", m, n); -- 會印出 20, 16 。並跑到 f53(n,m % n)
  2. 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);
   }
}

mn164\begin{array}{|c|c|} m & n\\ \hline 16 & 4\\ \end{array}

# 第三題

(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);
}
  1. f41(&a, &b, &c); – 此時 a = 5, b = 3, c = 1。
  2. f41(int* p, int* q, int* r) – 此時 p = &a, q = &b, r = &c。

abcpqrppqqrr531&a&b&c&p&q&r\begin{array}{|c|c|c||c|c|c||c|c|c|} a&b&c&p & q & r&pp&qq&rr\\ \hline 5&3&1&\&a & \&b & \&c & \& p & \& q & \&r\\ \end{array}

  1. q = r; r = p; *p += 1; *q = *r + 3;
    printf("%d, %d\n", *p, *q); – 6, 9

abcpqrppqqrr639&a&c&a&p&q&r\begin{array}{|c|c|c||c|c|c||c|c|c|} a&b&c&p & q & r&pp&qq&rr\\ \hline 6&3&9&\&a & \&c & \&a & \& p & \& q & \&r\\ \end{array}

  1. qq = &p; *rr = q; **qq = *r + **pp;

abcpqrppqqrr1539&a&c&c&p&p&r\begin{array}{|c|c|c||c|c|c||c|c|c|} a&b&c&p & q & r&pp&qq&rr\\ \hline 15&3&9&\&a & \&c & \&c & \& p & \& p & \&r\\ \end{array}

  1. 回到 test04()printf("%d, %d\n", a, b); – 15, 3
  2. f42(arr, a, &b, &c);
  3. void f42(int a[], int p1, int* p2, int* p3) {

abcp1p2p3153915&b&c\begin{array}{|c|c|c||c|c|c|} a&b&c&p1&p2&p3\\ \hline 15&3&9&15&\&b&\&c\\ \end{array}

  1. a[0] = 0; p1 = 1; *p2 = 2; p3 = a + 2;

abcp1p2p315291&b17\begin{array}{|c|c|c||c|c|c|} a&b&c&p1&p2&p3\\ \hline 15&2&9&1&\&b&17\\ \end{array}

a[0]a[1]a[2]a[3]a[4]a[5]0123411\begin{array}{|c|c|c|c|c|c|} a[0]&a[1]&a[2]&a[3]&a[4]&a[5]\\ \hline 0&1&2&3&4&11\\ \end{array}

  1. printf("%d, %d\n", b, c); – by test04() 2, 9
  2. arr[0] = 0; arr[1] = 1; arr[2] = 2; arr[3] = 3; arr[4] = 4; f43(arr);

a[0]a[1]a[2]a[3]a[4]a[5]0123411\begin{array}{|c|c|c|c|c|c|} a[0]&a[1]&a[2]&a[3]&a[4]&a[5]\\ \hline 0&1&2&3&4&11\\ \end{array}

void f43(int a[]) {
	f41(&a[2], &a[1], &a[0]);
	printf("%d, %d, %d\n", a[0], a[1], a[2]);
}
  1. f41(&a[2], &a[1], &a[0]);

abc1539\begin{array}{|c|c|c|} a&b&c\\ \hline 15&3&9\\ \end{array}

  1. 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 。,

pqr316\begin{array}{|c|c|c|} p&q&r\\ \hline 3&1&6\\ \end{array}

qq = &p; *rr = q; **qq = *r + **pp;
	printf("%d, %d\n", **qq, **rr);

第一個位置 = 第一個位置 + 第三個位置 。並輸出 第一,第三的位置。

pqr916\begin{array}{|c|c|c|} p&q&r\\ \hline 9&1&6\\ \end{array}

  1. printf("%d, %d, %d\n", a[0], a[1], a[2]);

a[0]a[1]a[2]a[3]a[4]a[5]6193411\begin{array}{|c|c|c|c|c|c|} a[0]&a[1]&a[2]&a[3]&a[4]&a[5]\\ \hline 6&1&9&3&4&11\\ \end{array}