- 1、本文档共67页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
指标与阵列之间的关系
Chapter 7 – 指標(Pointers) 7.1 簡介 指標 功能強大、但很難完全掌握 可模擬傳參照呼叫方式 與陣列、字串的關係很密切 可以執行動態資料結構, 例如:linked lists(鏈結串列), queues(佇列), stacks(堆疊) and trees(樹). 7.2 指標變數宣告與初始化 指標變數 其內容是「記憶體位址」 一般變數內容是某個值(直接存取) 指標內含某個有特殊值之變數的位址(間接存取) Indirection 間接 存取一指標的值 指標變數的宣告 - 使用之前必須先宣告 * 表示該變數是一個指標變數 int *myPtr, myData; //myData 是整數變數 宣告指向 int 的指標,也就是型態為 int * 的指標 一個宣告敘述要宣告多個指標時,要寫多個 * int *myPtr1, *myPtr2; 7.2 指標變數宣告與初始化 可以宣告指向任何資料型態的指標 指標的初始化 可初始化為 0, NULL, 或一個位址 0 或 NULL 表示不指向任何東西 良好的程式設計習慣7.1 讓所取的指標變數包含有 Ptr 的字樣,可以更清楚地表達這些變數是指標,而不是一般變數,需要適當地處理。 避免錯誤的小技巧 7.1 對指標作初值化,可避免指標指到未知或未初始化的記憶體。 7.3 指標運算子 (address operator、定址運算子) 傳回運算元位址的單元運算子 例如 int y = 5;int *yPtr;yPtr = y; // yPtr 拿到 y 的位址 yPtr “指向” y 7.3 指標運算子 * (indirection/dereferencing 運算子) 傳回運算元所指到的記憶體內容 前面的例子中 *yPtr 就傳回 y (因為 yPtr 指向 y). * 可用來將某個值存到指標所指向的記憶體中 *yPtr = 7; // 將 7 存到 y 中 被 * 運算的指標一定要是 lvalue(不可是數值) * 與 是相反的運算 會互相抵銷 *myVar == myVar 與 *yPtr == yPtr 7.3 指標運算子 常見的程式設計錯誤 7.2 透過未適當初始化的指標來、或未指向適當位址的指標來存取,都可能產生執行時期的致命錯誤,或者可能會無意修改到重要資料,或者執行結束但得到錯誤的結果。 7.4 利用參照呼叫函式 C 有三種傳參數的方法 用指標引數作 call by reference 用 傳遞引數的位址 允許函式改變引數的內容(因為知道該引數的位址) 傳陣列時不需寫 ,因為陣列名稱就是記憶體位址 在函式中用 * 來存取參數內容 void doubleNum( int *number ) { *number = 2 * ( *number );} *number 代表傳入函式中的引數內容 呼叫函式時,必須傳入記憶體位址 doubleNum( myNum ); 7.4 利用參照呼叫函式 常見的程式設計錯誤 7.3 需要對指標求值來拿到指標所指到的記憶體內容時卻忘記作求值動作的話,會產生錯誤。 避免錯誤的小技巧 7.2 除非被呼叫的函式明確地需要修改呼叫者所傳入之引數值,否則都應使用傳值呼叫來傳遞引數,這才符合最小開放權限的原則。 7.5 將指標宣告為 const 的用法 const 修飾詞 常數變數內容不可被改變 當函式不需改變變數內容時就應使用 const 企圖改變 const 變數時,會產生編譯錯誤 const 指標 只能指向相同的記憶體位址 宣告時需要作初值化 int *const myPtr = x; int *const -指向非常數資料的常數指標 const int *myPtr = x; const int -指向常數資料的非常數指標 const int *const Ptr = x; const int *const -指向常數資料的常數指標 7.5 將指標宣告為 const 的用法 執行上的小技巧 7.1 使用指向常數資料的指標或參照來傳遞大量資料,可以達到 call-by-reference 的效率與 call-by-value 的安全性。 7.6 使用傳參考呼叫的泡沫排序法 使用指標來實作泡沫排序法 swap 函式必須接收兩個陣列元素的記憶體位址(用 ) 陣列元素預設的傳參數方式是傳值呼叫 使用指標與 * 運算子,swap 能夠將兩個陣列元素的內容互相對調。 虛擬碼 Initialize array print data in original order Call function bubblesort print sorted a
文档评论(0)