周立功教授數年之心血之作《程序設計與數據結構》以及《面向AMetal框架與接口的編程(上)》。書本內容公開后,在電子行業掀起一片學習熱潮。經周立功教授授權,本公眾號特對《程序設計與數據結構》一書內容進行連載,愿共勉之。
第二章為程序設計技術,本文為2.2.5 結構體數組。
>>>2.2.5 結構體數組
下面將以控制臺菜單選項為例,介紹多分支選擇結構程序設計的思想與實現方法。一般來說,菜單欄至少包括新建文件、打開文件、保存文件和退出4項基本功能。比如:
如果使用函數指針,這4個函數的調用形式如下:
而新建文件、打開文件、保存文件和退出都可以作為字符串"新建文件"、"打開文件"、"保存文件"和"退出"存儲在char數組中。比如:
基于此,可以先聲明一個結構體類型CmdEntry,其聲明如下:
接著定義一個結構體數組作為函數表,分別用于存儲菜單函數的入口地址和菜單信息。其聲明如下:
在這里,將cmdArray聲明為一個內含10個元素的數組,數組的每個元素都是一個CmdEntry類型的數組,因此cmdArray[0]是第一個CmdEntry類型的結構體變量,cmdArray[1]是第2個CmdEntry類型的結構體變量,以此類推。cmyArray是數組名,該數組中的每個元素都是CmdEntry類型的結構體變量。
為了標識結構體數組中的成員,可以采用訪問單獨結構體的規則:在結構體名后面加一個點運算符,再在點運算符后面加上成員名。比如:
注意,數組下標緊跟在cmyArray后面,不是成員名后面。比如:
使用cmdArray[2].cHelp的原因是:cmdArray[2]是結構體變量名,正如cmdArray[1]是一個結構體變量名。使用cmdArray[3].cHelp的原因是cmdArray[3]是結構體變量名,如同cmdArray[0]是另一個變量名。由于數組變量名代表數組首元素的地址,因此下面兩個語句是等價的:
那么*pCmdEntry=cmdArray[0],因為&和*是一對逆運算符,所以可以做以下替換:
由于.運算符比*運算符的優先級高,因此必須使用圓括號。順帶提一下,下面的表達式代表什么?
這是cmdArray數組第1個結構體變量(cmdArray[0]部分)中的第2個字符(cHelp[1]部分),這個字符為“建”。這個示例指出,點運算符右側的下標作用于各個成員,點運算符左側的下標作用于結構體數組。最后總結一下:
根據上面的定義,即可用以下方式獲得相應函數的入口地址。比如:
即pfuncmd函數指針指向CreateFile()函數,其調用形式如下:
由此可見,采用回調函數動態綁定的方式,程序的可擴展性得到了很大的提升。只需在“<標注>1”處添加自定義的函數,無需多處修改代碼,不僅可以很好地解決程序的可擴展性問題,而且還大大地降低程序的出錯幾率,詳見程序清單2.26。
程序清單2.26 控制臺菜單選項程序
請用bubbleSort()算法完成這個練習,將employeeArray結構體數組分別按下列要求排序并輸出:(1)按id從小到大排序;(2)按weight、age、height從小到大排序,相同時按id從小到大排序;(3)bloodType按A、B、O、AB順序排序,相同時按id從小到大排序。
-
結構體數據
+關注
關注
0文章
3瀏覽量
5969
原文標題:周立功:結構體數組的應用
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論