我猜我太久沒有寫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++ Code::Blocks編譯器的初學者教學指南:如果你苦惱的是編譯器的使用,可以看看設定C和C++ Code::Blocks編譯器的初學者教學指南。
- Code::Blocks 13.12 繁體中文化:如果想要使用code block 中文的朋友可以繼續閱讀Code::Blocks 13.12 繁體中文化,這裡不會有code block中文亂碼的問題。
- 設定Dev-C++ 5.11和MinGW-w64, Windows上免費的C跟C++編譯器
- C跟C++的Apple XCode
- g++簡介
- 使用Microsoft Visual C++ 2010 Express編譯GTK+
- Eclipse+CDT+MinGW 安裝測試
- 編譯器gcc
- Code::Blocks 20.03的安裝設定及繁體中文化
1 則留言