freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

從問題到程序ppt課件(已修改)

2024-11-15 16:54 本頁面
 

【正文】 從問題到程序 第七章,指針 程序執(zhí)行中數(shù)據(jù)存于內(nèi)存。 在可用期間數(shù)據(jù)有確定存儲位置,占據(jù)一些存儲單元。 內(nèi)存單元的編號: 地址 。 機器語言通過地址訪問數(shù)據(jù)。高級語言用變量等作為存儲單元 /地址的抽象。 建立變量就是安排存儲。賦值時存入,用值時從中提取 外部變量 /靜態(tài)變量有全局存在期,程序執(zhí)行前安排存儲位置,保持到程序結束。 自 動變量在函數(shù)調(diào)用時安排存儲,至函數(shù)結束。再調(diào)用時重新安排存儲 。 地址與指針 變量 存在期 就是它占據(jù)所安排存儲的期間。 任何變量在存在期間總有確定存儲位置,有固定 地址 。 寄存器變量可能放在寄存器,無地址。本章不考慮寄存器變量。 變量存在時有地址,地址用二進制編碼,因此可能成為程序處理的 數(shù)據(jù) 。 問題:地址作為數(shù)據(jù)有什么用? 若程序可以處理對象地址,就可通過地址處理相關對象。 對象(如變量)地址也被作為 數(shù)據(jù) , 地址值 /指針值 。以地址為值的變量稱為 指針變量 /指針 (pointer)。 指針是一種訪問其他對象的手段 ,利用這種機制能更靈活方便地實施對各種對象的操作。 指針的主要操作 ? 指針賦值:將程序?qū)ο蟮牡刂反嫒胫羔樧兞俊? ? 間接訪問:通過指針訪問被指對象。 指針還能保存其他對象的地址。下面討論以變量為例。 指針 p保存著變量 x地址,也說指針 p指向 x。圖示: 指針變量 p變量 x圖  指針與被指的變量在 C中使用指針常能寫出更簡潔有效的程序。有些問題必須用指針處理。 指針在大型復雜軟件中使用廣泛。指針使用的水平是評價人的 C程序設計能力的重要方面。 C指針靈活 /功能強。掌握有難度,易用錯,應特別注意。應特別注意使用指針的常見錯誤, 注意! 指針是變量,可賦值,其指向可以改變。 現(xiàn)在 p指向 x,以后可能指向 y。 通過 p訪問被指對象的 語句 目前訪問 x,后來就訪問 y。這種新的靈活性很有用。 指針變量的定義和使用 指針有類型,只能保存特定類型的變量的地址 指向 int的指針 p只能指向 int變量。 p所指也看作 int,從 p間接訪問當作 int。常說 int指針 p1等。 定義指針需指明 指向類型 。 定義指向 int的 指針變量 : int *p, *q。 指針變量可以與其他變量一起定義: int *p, n, a[10], *q, *p1, m。 指針是 變量 , 可賦值取值 , 有定義域與存在期 。 應賦給類型正確的指針值 , 取出的值是特定類型的指針值 。 用 (int*)表示整型指針的類型 , 其他類似 。 指針操作 取地址運算符 amp。 和間接訪問操作 *。都是一元運算符 指針變量 p變量 n圖  兩個指針指向同一個變量的情況指針變量 q取地址運算 amp。 寫在變量描述 (如變量名)前 取 變量地址,是對應類型的指針值,可賦給類型合適的指針。例: p = amp。n。 q = p。 p1 = amp。a[1]。 多個指針可能同時指向同一變量。變量相等是值相等,兩個指針變量相等說明它們指向程序里同一東西。 間接運算 間接運算得到被指針所指的變量 , 這種表達式可以像普通變量一樣使用 。 設 p指向 n。 間接賦值: *p = 17。 這里寫 *p相當于直接寫 n。 另一個賦值: m = *p + *q * n。 /* 訪問 n三次 */ ++ *p。 /* 使變量 n的值加 1, 變成 18 */ (*p)++。 /* 使變量 n的值再加 1, 變成 19。 */ *p += *q + n。 /* 變量 n被賦以新值 57 */ q = amp。a[0]。/* 指針 q指向了數(shù)組 a的元素 */ 指針作為函數(shù)參數(shù) 指針作為函數(shù)參數(shù)有特殊意義,利用這種參數(shù)可寫出能修改調(diào)用時環(huán)境的函數(shù)。 函數(shù)調(diào)用處的環(huán)境 指在調(diào)用函數(shù)的位置能訪問的變量全體。 前面函數(shù)的特點:可使用調(diào)用處環(huán)境中變量的值(通過參數(shù)),但不能修改這些變量(數(shù)組參數(shù)除外)。 在函數(shù) f里調(diào)用 g,可將 f的局部變量作為實參。但用 g改變 f局部變量的唯一方法是將 g的返回值賦給 f的局部變量。 這種方法局限性太強,例如無法在一個函數(shù)調(diào)用中修改兩個局部變量的值。利用 指針可以改變這種情況。 例:定義函數(shù) swap, 希望用它交換兩個變量的值 。 因為要改變兩個變量 , 無法通過返回值解決 。 下面定義不行: void swap0 (int x, int y) { int t = x。 x = y。 y = t。 } int f(…) { int a = 5, b = 10。 swap0(a, b)。 … /*不行 */ } 函數(shù)內(nèi)修改形參,不會改變調(diào)用時的實參。 分析 :要(在一函數(shù)里)通過 調(diào)用函數(shù) g修改調(diào)用處的變量(如局部變量),必須在 g里 掌握 這個 變量。 用指針可以解決問題。 把 m的地址(也是值)通過指針參數(shù) p傳給 g,函數(shù)內(nèi)對p間接訪問就能操作 m,包括對 m賦值(改變 m)。 g 的 函數(shù)體參數(shù) p變量 m在函數(shù)體里用 *p 可以訪問和改變實參變量 m.圖  在函數(shù)里通過指針可以訪問外面的變量例,通過函數(shù)調(diào)用把變量值設置為 3: void set3(int * np) { *np = 3。 } 使用實例: int main() { int n, m。 set3(amp。n)。 /* 設置 n和 m */ set3(amp。m)。 printf(%d, %d\n, n, m)。 return 0。 } 請回憶 scanf的情況。 通過參數(shù)改變調(diào)用環(huán)境的方案 包括三方面: 1. 函數(shù)定義中用 指針參數(shù) ; 2. 函數(shù)內(nèi)用 間接操作 實際變量; 3. 調(diào)用時以被操作 變量的地址 作為實參。 函數(shù) swap可定義為: void swap(int *p, int *q) { int t = *p。 *p = *q。 *q = t。 } 交換變量 m和 n的值 , 調(diào)用形式是: swap(amp。m, amp。n)。 swap的參數(shù)類型是 (int *), 實參 必須是 合法的整型變量的地址 。 swap 的 函數(shù)體p變量 m圖  函數(shù)調(diào)用 swap(amp。m, amp。n) 形成的現(xiàn)場變量 nq設有變量定義: int a[10], k。 調(diào)用 swap的實例: swap(amp。a[0],amp。a[5])。 swap(amp。a[1],amp。k)。 介紹標準庫函數(shù) scanf時 , 強調(diào)在接受輸入的變量前必須寫 amp。, 就是將變量的地址傳給 scanf。 scanf采用與 swap一樣的技術 , 通過間接訪問為指定變量賦值 , 把輸入的值賦給指定變量 。 例:改造上章輸入整數(shù)值并檢查值范圍的函數(shù),引進指針參數(shù),使之能更好處理輸入錯誤。 前面實現(xiàn)里用特殊整數(shù)值指明輸入出錯,有很大缺點(可能不存在合適的值)。 指針參數(shù)提供了另一種方法: 函數(shù)增加一個指針參數(shù),通過它送回讀入值。用函數(shù)返回值傳遞函數(shù)執(zhí)行的狀態(tài)信息。 返回 1表示輸入成功, 0表示輸入未能正常完成。 新函數(shù)定義: int getnumber(char prompt[], int imin, int imax, int repeat, int *np) { int i。 for (i = 0。 repeat=0 || irepeat。 ++i) { printf(%s, prompt)。 if (scanf(%d, np)!=1 || *npimin || *npimax) { printf(Correct range [%d, %d].\n, imin, imax)。 while (getchar() != 39。\n39。) 。 } else return 1。 } return 0。 } 前面的調(diào)用現(xiàn)在可以重寫為: getnumber(Choose a range [0, n]. Input n: , 2, 32767, 5, amp。m)。 getnumber(Your guess: , 0, m1, 5, amp。guess)。 更合適的調(diào)用形式: if (getnumber(Your guess: , 0, m1, 5, amp。guess) == 0) { … /* 處理輸入出錯的程序片段 */ } 這類函數(shù)的形參為指針,實參必須是合法變量地址。 這里可以看到標準庫函數(shù) scanf的樣子。通過返回值表示函數(shù)的工作情況,是 一種 常用技術。 與指針有關的一些問題 空指針值: 一個特殊指針值,表示指針變量閑置(未指向任何變量)。唯一對任何指針類型都合法的值 空指針值用 0表示,標準庫專門定義了符號常量 NULL p = NULL。 和 p = 0。 相同 前一寫法易看到是指針 , 用時必須包含標準頭文件 。 指針初始化 指針變量定義時可用合法指針值初始化: int n, *p = amp。n, *q = NULL。 若沒有初始化 , 外部指針和局部靜態(tài)指針自動初始化為用空;局部自動指針不自動初始化 。 指針使用中的常見錯誤 使用指針的最常見錯誤是 非法間接訪問 :在指針未指向合法變量的情況下做間接。如: int f (...) { int *p, n = 3。 *p = 2。 ... } p沒有初始化 , 沒有指向合法變量 。 “懸空指針”指值不是(當時)合法的變量地址的指針變量,也常被稱為“野指針”。 間接訪問懸空指針是嚴重錯誤,后果可能很嚴重。 常見錯誤寫法(設 p是懸空 int指針, n是 int變量): swap(p, amp。n)。 scanf(..., p)。 scanf(..., n)。 編譯程序不能發(fā)現(xiàn) scanf的錯誤 。 有些系統(tǒng)可能對第一個例子 ( 假設 p未初始化 ) 給出警告 。 間接訪問空指針也同樣無理 , 是非法的 。 通用指針 類型 (void*), 可以指向任何變量 。聲明: int n, *p。 double x, *q。 void *gp1,*gp2。 任何指針值可以賦給通用指針 ( 不必轉換 ) 。 例: gp1 = amp。n。 // gp1指向 n( 值是 n的地址 ) gp2 = amp。x。 // gp2指向 x 若通用指針 gpt指向 g, g類型是指針 pt的指向類型,將gpt賦給 pt(要寫強制轉換)通過 pt保證正確訪問 g。gp1 = amp。n。 p = (int*)gp1。 /*合法, p是 (int*) */ q = (double*)gp1。/*不合法 , q是 (double*) */ 其他使用方式?jīng)]有任何保證。 編譯程序不能識別強制轉換錯誤 。 指針類型轉換并不改變指針值 ? 將整型變量 n的地址賦給通用指針 gpt, gpt存的就是n的地址。賦回整型指針不會有問題。 ? 將該地址賦給 double指針,就造成了混亂。 指針類型代表一種觀點。被整型指針所指的變量總看成是整型的變量;被雙精度指針指向 …… 。 指針轉換是觀點轉換。從整型指針轉換到通用指針就是丟掉類型信息。C保證恢復到原有類型(轉回整型指針),被指對象還可用。 通用指針 不能做間接運算 ? 被普通指針指向的變量的類型明確,間接后可以作為該類型的變量使用 ? 通用指針可以指向任何變量,通過通用指針間接訪問的意義無法確定。通用指針沒提供被指對象的類型信息,所以不能通過它們直接使用被指對象 ? 通用指針最無用,唯一用途就是提供指針值 ? 標準庫的某些函數(shù)使用了通用指針(后面會看到) 指針與數(shù)組 C指針與數(shù)組關系密切 , 以指針為媒介可以完成各種數(shù)組操作 。 常能使程序更加簡潔有效 。 用指針做數(shù)組操作同樣要 特別注意 越界錯誤 。 指針和數(shù)組
點擊復制文檔內(nèi)容
教學課件相關推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1