悉指标的人,会将它比喻是天上那一颗最美的星星,而让不

上传人:艾力 文档编号:36493145 上传时间:2018-03-29 格式:PDF 页数:23 大小:1.04MB
返回 下载 相关 举报
悉指标的人,会将它比喻是天上那一颗最美的星星,而让不_第1页
第1页 / 共23页
悉指标的人,会将它比喻是天上那一颗最美的星星,而让不_第2页
第2页 / 共23页
悉指标的人,会将它比喻是天上那一颗最美的星星,而让不_第3页
第3页 / 共23页
悉指标的人,会将它比喻是天上那一颗最美的星星,而让不_第4页
第4页 / 共23页
悉指标的人,会将它比喻是天上那一颗最美的星星,而让不_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《悉指标的人,会将它比喻是天上那一颗最美的星星,而让不》由会员分享,可在线阅读,更多相关《悉指标的人,会将它比喻是天上那一颗最美的星星,而让不(23页珍藏版)》请在金锄头文库上搜索。

1、序 言 ii C 語言的最大特色就是指標(Pointer),這是個讓人又愛又怕受傷害的主題。有一句話是,學過 C,而不會指標,那只能說您看過 C。熟悉指標的人,會將它比喻是天上那一顆最美的星星,而讓不懂的人,頭上會冒星星,同樣是星星,但卻有不同的情境。 指標好難喔,像無字天書,不知道該如何學,從哪一地方開始下手,有沒有秘訣,常常有人會對我講這些話,並問我有沒有好方法可以頓悟它。有許多人學到指標時,便裹足不前。基本原因是沒有專書討論指標及與其相關的主題。基於此,便開始規劃,撰寫一本以指標為核心的書籍,使得對指標不太懂的人,可以輕易解指標的運作原理與其應用,同時也可以讓已了解的人精益求精,更進一步

2、探考個中的奧秘。現在,已夢想成真,從書名精通 C/C+ 指標:深入系統底層技術,就知道它是您學習與深入指標的最佳讀本。 本書內容精彩無比,除對 C/C+ 語言的指標有深入的探討外,同時也將與指標有曲同工之妙的 reference 詳加討,所以本書不僅有 C而已,還包括 C+ 程式語言,有關 reference 的主題。其實不僅 C+ 使用 reference 的概念,Java、C# 以及 Python 也是以 reference 達到和 C 語言的指標之功能。所以本書也加入 Java、C# 以及 Python 這三種程式語言相關議題的討論。 我們從 C 語言的指標與其息息相關的記憶體基本概,開

3、始展開這一次的快樂探險旅程,其中會經過:指標與變數、指標與陣列、指標與函數、指標與字串、指標與結構、鏈結串列、二元搜尋樹、指標與檔案處理等刺激關卡,希望能有效導引讀者進入指標的深層世界。同時也會以鏈結串列、二元搜尋樹,檔案的處理等重要的主題,加以應用於本書所談的其它程式語言,從而驗證指標與 reference 的相似功能。 序 序 言 iii 本書的共有六篇,前五篇分別是當今很紅的程式語言,分別是 C、C+、Java、Visual C# 及 Python。第六篇是各種程式語言比較篇,將 C、C+、Java、Visual C# 及 Python 等五種程式語言,在程式語言基本架構上的主題做比較,

4、希望此篇可以讓您一窺程式語言之美。 撰寫本書的心情不知為什麼,雖然很辛苦,但覺得好愉快,因為我的期望快實現了,因為您可以從本書輕輕鬆鬆的解指標的精髓,進而加以應用,並告訴我,指標是天上閃亮的星星。 擁護我的讀者不在少數,有的在國內,有的在大陸,因此,常常會聽到:老師,我是看您的書長大的。真的有一種使命感,要撰寫一些進階有參考價值的書,本書完成了,真誠的希望您可以從書中獲取一些知識,做為您的一技之長。再一次的謝謝您的一路的相陪、支持與鼓勵,讓我有動再出發,感恩。 指標與函數 04 4-1 函數初探 4-2 兩數對調 4-3 再論傳址呼叫 4-4 指向函數的指標 4-5 傳回指標的函數 4-6

5、除錯題 4-7 問題演練 4-8 程式實作 Part 1 C 程式語言篇 80 4-1 函數初探 函數函數(function)是執行某一任務的片段程式。它的好處是使程式模組化、重複使用、降低維護成本等功能。函數可分為兩種,一為庫存函數(library function), 它 是 編 譯 器 所 提 供 的 , 二 為 使 用 者 自 定 函 數 (user-defined function),它是由使用者撰寫的。本章所討論的是後者。 函數的呼叫可分為傳值呼叫傳值呼叫(call by value)與傳址呼叫傳址呼叫(call by address)。傳值呼叫表示實際參數傳給形式參數的是值值(v

6、alue),而傳址呼叫則是傳位址位址(adddress)。 我們先從一簡單的範例談起,請參閱範例程式 functionCall-5。 範例程式:functionCall-5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /* functionCall-5.c*/ #include double calAverage(double, double); int main() double x, y, aver; printf(“請輸入x與y的浮點數: “); scanf(“%lf %lf“, aver = calAverage(x, y

7、); printf(“x與y的平均數為: %.2fn“, aver); getchar(); return 0; double calAverage(double a, double b) double average; average=(a+b)/2; return average; Chapter 4 指標與函數 81 輸出結果 請輸入請輸入x與與y的浮點數的浮點數: 12.34 45.67 x與與y的平均數為的平均數為: 29.01 程式將實際參數 x 與 y 傳送給 calAverage 函數的形式參數 a 與 b,計算此兩數的平均數,並指定給 average 變數後,回傳給主程式的

8、aver,最後將它輸出。注意!由於 calAverage 函數的資料型態是 double,所以函數的回傳值 average 的資料型態也必須是 double。由於 aver 變數用於接收average 變數值,所以 aver 的資料型態也必須是 double。由於實際參數傳給形式參數是變數值,所以稱此為傳值呼叫。 4-2 兩數對調 指標到底有什好處呢?我們從兩數對調的運作方式談起,請參閱範例程式 swapType。 範例程式:swapType 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /* swapType.c */ #include void

9、swap_by_address(int *, int *); void swap_by_value(int, int); int main() int x=100, y=200; /* Call by value */ printf(“Call by valuen“); printf(“Before swapping.n“); printf(“x=%d, y=%dn“, x, y); swap_by_value(x, y); printf(“After swapping.n“); printf(“x=%d, y=%dnn“, x, y); /* Call by address */ x = 1

10、00; y = 200; Part 1 C 程式語言篇 82 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 printf(“Call by addressn“); printf(“Before swapping.n“); printf(“x=%d, y=%dn“, x, y); swap_by_address( printf(“After swapping.n“); printf(“x=%d, y=%dnn“, x, y); getchar(); return 0; void swap

11、_by_value(int a, int b) int temp; temp = a; a = b; b = temp; void swap_by_address(int *a, int *b) int temp; temp = *a; *a = *b; *b = temp; 輸出結果 Call by value Before swapping. x=100, y=200 After swapping. x=100, y=200 Call by address Before swapping. x=100, y=200 After swapping. x=200, y=100 Chapter

12、4 指標與函數 83 從輸出結果得知,利用傳值呼叫無法達到兩數對調的效果,但利用傳址傳址呼叫呼叫就可以。swap_by_value()為傳值呼叫函數,如圖 4-1 所示: x 10 y 20 a 10 b 20 temp temp = a; a = b; b = temp; 圖 4-1 傳值呼叫 而 swap_by_address()為傳址呼叫函數,如圖 4-2 所示: x 10 20 a b temp temp = *a; *a = *b; *b = temp; int main() int i; int arr = 20, 10, 100, 40, 60, 80, 90; int elem

13、ents = sizeof(arr)/sizeof(arr0); int maxNumber = findmax(arr, elements); printf(“Max( “); for(i=0; i max) max = xj; return max; 輸出結果 Max( 20 10 100 40 60 80 90) is 100 在 findmax 函數中(第 2028 行),x 陣列其實就是 arr 陣列,因為此函數的呼叫是傳址呼叫,將 arr 陣列第一個元素的位址,指定給 x 陣列。findMax()函數也可以撰寫成以下的片段程式: Chapter 4 指標與函數 85 int fin

14、dmax(int *, int n); /* 函數語法宣告函數語法宣告 */ int findmax(int *x, int n) /* 函數定義函數定義 */ int j; int max = *x; for(j=1; j max) max = *(x+j); return max; 上述兩種寫法都可以。因為 和 * 都是指標。我個人比較喜歡使用 *的方式,因為它好像天上一顆閃亮的星星。 4-3-2 加總一維陣列的元素 接下來,討論如何呼叫一函數,以計算一維陣列元素的總和,如範例程式 sumOfArray1-1 所示。 範例程式:sumOfArray1-1 1 2 3 4 5 6 7 8 9

15、 10 11 12 13 14 15 16 17 18 19 /* sumOfArray1-1.c */ #include int sum(int , int); int main() int i; int arr = 10, 20, 30, 40, 50, 60, 70, 80, 90, 100; int elements = sizeof(arr)/sizeof(arr0); int total = sum(arr, elements); printf(“Sum( “); for(i=0; i int sum(int *, int); int main() int i; int arr = 10, 20, 30, 40, 50, 60, 70, 80, 90, 100; int elements = sizeof(arr)/sizeof(arr0); int total = sum(arr, elements); printf(“Sum(“); for(i=0; i int sum(int 2, int, int); int main() int i, j, row, column, total=0; int arr22 = 10, 20, 30, 40, 50, 60, 7

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号