指位器与函式 - NCNU Moodle 课程.PPT

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
指位器与函式 - NCNU Moodle 课程

著作權所有 ? 旗標出版股份有限公司 第 12 章 指位器 (pointer) 本章提要 本章簡介 記憶體位址 指位器的基本用法 動態記憶體配置 (Dynamic Memery Allocation) 指位器與陣列 指位器與函式 雙重指位器 命令參數的引入:argc、argv 綜合演練 本章簡介 指位器 (pointer) 也是一種變數, 但是此種變數儲存的並非一般數值, 而是記憶體位址。當指位器變數所存的值是位址時, 我們稱此指位器指向該位址所表示的記憶體空間。 指位器可以用來表示複雜的資料的結構, 或者有效率的存取陣列的資料。但是, 因為使用指位器的過程中, 會涉及許多記憶體位址與空間的概念, 造成不了解此種概念的讀者學習上的困難。 記憶體位址 指位器是專門用來存放記憶體位址的變數。 何謂位址? 我們可以把記憶體的內部, 想像成一個一個排列整齊可用來裝填資料的小格子, 每個小格子的大小都相等 (1 byte)。而位址就是用來區別這些小格子, 也就是這些格子的『地址』。 記憶體位址 我們可以利用 算符, 找出變數在記憶體中被配置的位址, 語法如下: 在任何變數名稱前加上 算符後, 就表示該變數在記憶體中的位址, 而不是變數值。利用 printf ( ) 配合輸出格式 %p, 就可以輸出以 16 進位數值表示的記憶體位址, 如下: 記憶體位址 記憶體位址 因為 4 個變數都是整數型別, 所以在記憶體中各佔 4 bytes。在記憶體中, 每個 byte 都有獨立的位址, 以代表該空間在記憶體中的位置。 記憶體位址 如下圖: 指位器的基本用法 指位器的運用, 主要是在一種稱為『指向』的觀念。當指位器中儲存著一個變數的位址時, 我們稱此指位器指向該變數。 宣告的語法如下: 指位器的基本用法 資料型別:指位器的型別, 必須與該指位器所指向的變數型別相同。 *:稱為『間接』算符 (indirection), 意指指示器存放的是儲存變數的位址, 不能直接取得變數的值, 必須在指位器上使用間接算符才能取得變數值。宣告指位器變數時, 需在變數名稱前加上此算符。 指位器:也就是指位器變數的名稱, 命名的原則和一般變數相同。 指位器的基本用法 比如說: 如此一來, ptr 便是指向 number 的指位器了。 指位器的基本用法 指位器的空間大小 設定指位器的值 指位器的轉型 指位器的運算 使用指位器的好處 指位器的空間大小 由於指位器記錄的是記憶體位址, 所以不管指位器宣告成何種型別, 在記憶體中都會配置相同的空間 (4 bytes), 我們可以利用 sizeof ( ) 來驗證, 如下: 指位器的空間大小 指位器的空間大小 第 10~14 行, 將各種型別指位器的容量, 利用 sizeof 計算出來, 然後從螢幕輸出。 設定指位器的值 指位器也是一個變數, 所以和變數一樣可以設定其值。如果我們將指位器採用與變數相同的設定方式, 如下: 設定指位器的值 由於 ptr 本身未被設定初始值, 所以其值有可能是任何數值, 換言之, ptr 可能指向任何的記憶體空間, 例如其它程式、甚至作業系統正在使用的記憶體空間。此時若將數值 35 指定到此不知位於何處的記憶體空間, 有可能導致程式執行發生錯誤。所以, 指位器不能使用上述的方法來設定其值。 當我們要將數值指定給指位器時, 我們需要以下面的步驟來完成: 設定指位器的值 事先宣告一個同型別的變數, 再讓指位器指向此變數位址: 完成上述指定動作之後, 就可以利用 * 算符, 從指位器中取出數值。也就是說 *ptr 的值會等於 10。 設定指位器的值 上面步驟完成後, 指位器與變數間的關係如下圖: 我們先宣告 3 種不同型別的指位器, 讓其分別指向 3 個變數, 然後輸出其值。如下: 設定指位器的值 指位器的轉型 指位器只能指向同型別的變數位址, 絕對不能有如下的情形: 若想將指位器指向不特定型別的變數, 可使用 void 這個特殊的型別來宣告指位器變數。void 型別的指位器可指向任何型別, 編譯器不會發出警告。 指位器的轉型 但要取用指位器所指的變數值時, 必須做強制型別轉換才能取出正確的值: 例如下面的範例程式, 就宣告了 2 個 void 型別的指位器, 並分別指向整數和浮點數變數, 而在算式中要用指位器參與計算時, 就要先做強制型別轉換: 指位器的轉型 指位器的轉型 如執行結果所示, void 型別的指位器, 只要做適當的強制型別轉換, 程式就能以正確的型別來取用指位器所指的變數。 指位器的運算 因為指位器內儲存的是位址, 所以對指位器做加減, 就等於是將所存的位址做加減, 所得到的將 會是鄰近 的位址。 如以下範 例:

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档