112 年 – 112 普通考試_資訊處理:程式設計概要題一#115544

我猜我太久沒有寫C語言了,整個指標跟位址的運算都忘了,所以在試著寫下面這一題的時候,就不會了,人老了…

一、根據以下C程式碼,回答下列問題:

#include <stdio.h>
void g(int *x,int *y){
*x = *y-1;
*y = *y -2;
printf("*x=%d, *y=%d\n",*x,*y);
}
void f(int *z, int *w){
int n = 13;
g(w,&n);
printf("*z=%d,*w=%d,n=%d\n",*z,*w,n);
}
int main()
{
int i = 21;
int j=5;
int n=137;
f(&i,&j);
printf("print 1:i=%d,j=%d,n=%d\n",i,j,n);
g(&n,&n);
printf("print 2:i=%d,j=%d,n=%d\n",i,j,n);

return 0;
}

【題組】 (一)請說明程式碼第8行至第12行中,每一行之運算子符號「*」及「&」操 作所代表的意義。(10分)

第8行:* 表示取值,這邊會對傳入的位址取出源頭變數的值,再設定给指標變數z,w。
第10行:& 表示取出變數的記憶體位址,這邊是取出區域變數n的記憶體位址當作參數傳遞

【題組】(二)請問該程式碼執行後輸出的結果為何?(15分)

一開始想要在Visual Studio 2017上編譯看看,結果發現

這是什麼鬼的問題,Google了好久還是沒有找到解決的方法,只好先放棄,改用線上編譯的方式,找到GDB Onlin做線上編譯,得出結果如下:

*x=12, *y=11
*z=21,*w=12,n=11
print 1:i=21,j=12,n=137
*x=134, *y=134
print 2:i=21,j=12,n=134

後來也想到在 Visual Studio 2017 中開啟開發人員命令提示字元來編譯C程式,編譯及執行結果如下:

答案都跟網路上找到的答案一致,現在我們就來想想怎麼算這個答案出來,各位可以參考下面我找到的指標教學來手算看看:

指標是C語言提供直接指引在記憶體某一個指定位址的一種類似於路標的設施。其實指標變數的內容就是一個記憶體位置,我們透過它可以直接存取某個記憶體位置的內容

 

 

 

 

 

 

 

 

 

 

 

看完了這些教學是不是C的指標就會了,希望大家明年的普考可以順利。

其他的教學彙整如下表,各位有興趣可以繼續閱讀。

 

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *