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

正文內(nèi)容

c程序設(shè)計(jì)指針ppt課件-在線瀏覽

2025-03-08 19:19本頁(yè)面
  

【正文】 mp。B)。a。B。p1=p2。} printf(\na=%D, B=%D\n\n, a, B)。 } 運(yùn)行情況如下: 5, 9 a=5, B=9 max=9, min=5 當(dāng)輸入 a=5, B=9時(shí),由于 a< B,將 p1和 p2交換。 圖 請(qǐng)注意, a和 B并未交換,它們?nèi)员3衷担?p1和p2的值改變了。a,后來(lái)變成 amp。B,后來(lái)變成 amp。這樣在輸出 *p1和*p2時(shí),實(shí)際上是輸出變量 B和 a的值,所以先輸出9,然后輸出 5。 指針變量作為函數(shù)參數(shù) 函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù),還可以是指針類型。下面通過(guò)一個(gè)例子來(lái)說(shuō)明。 今用函數(shù)處理,而且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。 temp=*p1。 *p2=temp。 int*pointer1, *pointer2。a, amp。 pointer1=amp。pointer2=amp。 if(a< B) Swap(pointer1, pointer2)。 } 運(yùn)行情況如下: 5, 9 9, 5 對(duì)程序的說(shuō)明: Swap是用戶定義的函數(shù),它的作用是交換兩個(gè)變量(a和 B)的值。程序運(yùn)行時(shí),先執(zhí)行 main函數(shù), 輸入 a和 B的值 (今輸入 5和 9)。接著執(zhí)行 if語(yǔ)句,由于 a< B,因此執(zhí)行 Swap函數(shù)。采取的依然是“值傳遞”方式。a,p2的值為 amp。見圖 (B)。接著執(zhí)行 Swap函數(shù)的函數(shù)體,使 *p1和 *p2的值互換,也就是使 a和 B的值互換。函數(shù)調(diào)用結(jié)束后, p1和 p2不復(fù)存在 (已釋放 ),情況如圖(D)所示。 圖 請(qǐng)注意交換 *p1和 *p2的值是如何實(shí)現(xiàn)的。 *temp=*p1。 p2=*temp。而 *temp是指針變量 temp所指向的變量。 *temp所指向的單元也是不可 預(yù)見的。應(yīng)該將 *p1的值賦給一個(gè)整型變量,如程序所示那樣,用整型變量 temp作為臨時(shí)輔助變量實(shí)現(xiàn) *p1和 *p2的交換。這恰和例 。請(qǐng)仔細(xì)分析,這個(gè)改變是怎么實(shí)現(xiàn)的。請(qǐng)讀者考慮一下能否通過(guò)下面的函數(shù)實(shí)現(xiàn) a和 B互換。 temp=x。 y=temp?!闭{(diào)用 Swap函數(shù),會(huì)有什么結(jié)果呢?如圖 。執(zhí)行完 Swap函數(shù)后, x和 y的值是互換了,但 main函數(shù)中的 a和 B并未互換。 為了使在函數(shù)中改變了的變量值能被 main函數(shù)所用,不能采取上述把要改變值的圖 辦法,而應(yīng)該用指針變量作為函數(shù)參數(shù),在函數(shù)執(zhí)行過(guò)程中使指針變量所指向的變量值發(fā)生變化,函數(shù)調(diào)用結(jié)束后,這些變量值的變化依然保留下來(lái),這樣就實(shí)現(xiàn)了“通過(guò)調(diào)用函數(shù)使變量的值發(fā)生變化,在主調(diào)函數(shù) (如 main函數(shù) )中使用這些改變了的值”的目的。②然后將指針變量作實(shí)參,將這 n個(gè)變量的地址傳給所調(diào)用的函數(shù)的形參 。④ 主調(diào)函數(shù)中就可以使用這些改 變了值的變量。 請(qǐng)注意,不能企圖通過(guò)改變指針形參的值而使指針實(shí)參的值改變。 p=p1。 p2=p。 p=p1。 p2=p。 int pointer1, *pointer2。a, amp。 pointer1=amp。 pointer2=amp。 if(a< B) Swap(pointer1, pointer2)。 } 作者的意圖是:交換 pointer1和 pointer2的值,使pointer1指向值大的變量。②調(diào)用 Swap函數(shù),將 pointer1的值傳給 p1,pointer2傳給 p2,見圖 (B)。④形參 p1 2將地址傳回實(shí)參 pointer1和 pointer2,使 pointer1指向 B, pointer2指向 a,見圖 (D)。 圖 但是這是辦不到的,程序?qū)嶋H輸出為“ 5, 9”。 C語(yǔ)言中實(shí)參變量和形參變量之間的數(shù)據(jù)傳遞是單向的“值傳遞”方式。調(diào)用函數(shù)不可能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指變量的值。難以做到這一點(diǎn)的。 Swap(int *pt1, int *pt2) { int temp。 pt1=*pt2。 } exChanGe(int *q1, int *q2, int *q3) { if(*q1< *q2) Swap(q1, q2)。 if(*q2< *q3) Swap(q2, q3)。 scanf(%D, %D, %D, amp。B, amp。 p1=amp。p2=amp。p3=amp。 exChanGe(p1, p2, p3)。 } 運(yùn)行情況如下: 9, 0, 10 10, 9, 0 數(shù)組的指針和指向數(shù)組的指針變量 一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址。所謂數(shù)組的指針是指數(shù)組的起始地址,組元素的指針是數(shù)組元素的地址。使用指針法能使目標(biāo)程序質(zhì)量高 (占內(nèi)存少,運(yùn)行速度快 )。 例如: int a[10]。 /*定義 p為指向整型變量的指針變量 */ 圖 應(yīng)當(dāng)注意,如果數(shù)組為 int型,則指針變量亦應(yīng)指向int型。a[0]。也就是說(shuō), p指向 a數(shù)組的第 0號(hào)元素,見圖 。因此,下面兩個(gè)語(yǔ)句等價(jià): p=amp。 p=a?!钡淖饔檬恰鞍?a數(shù)組的首地址賦給指針變量 p”,而不是“把數(shù)組 a各元素的值賦給 p”。a[0]。 p=amp。 /*注意,不是 *p=amp。*/ 當(dāng)然定義時(shí)也可以寫成 int p=a。 通過(guò)指針引用數(shù)組元素 假設(shè) p已定義為指針變量,并已給它賦了一個(gè)地址,使它指向某一個(gè)數(shù)組元素。 表示對(duì) p當(dāng)前所指向的數(shù)組元素賦予一個(gè)值 (值為 1)。例如,數(shù)組元素是實(shí)型,每個(gè)元素占 4個(gè)字節(jié),則 p+1意味著使 p的值 (地址 )加4個(gè)字節(jié),以使它指向下一元素。對(duì)實(shí)型, D=4。 圖 如果 p的初值為 amp。這里需要說(shuō)明的是 a代表數(shù)組首地址, a+i也是地址,它的計(jì)算方法同p+i,即它的實(shí)際地址為 a+i D。a[9],它指向 a[9]。例如, *(p+5) (a+5)就是 a[5]。實(shí)際上,在編譯時(shí),對(duì)數(shù)組元素 a[i]就是處理成 *(a+i),即按數(shù)組首地址加上相對(duì)位移量得到要找的元素的地址,然后找出該單元中的內(nèi)容。可以看出, [ ]實(shí)際上是變址運(yùn)算符,即將 a[i]按 a+i計(jì)算地址,然后找出此地址單元中的值。 根據(jù)以上敘述,引用一個(gè)數(shù)組元素,可以用: (1) 下標(biāo)法,如 a[i]形式 。其中 a是數(shù)組名, p是指向數(shù)組的指針變量,其初值 p=a。假設(shè)有一個(gè) a數(shù)組,整型,有10個(gè)元素。 main() { int a[10]。 for(i=0。i++) scanf(%D, amp。 printf(\n)。i< 10。 } (2) 通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。 int i。i< 10。a[i])。 for(i=0。i++) printf(%D, *(a+i))。 main() { int a[10]。 for(i=0。i++) scanf(%D, amp。 printf(\n)。p< (a+10)。 } 以上 3個(gè)程序的運(yùn)行情況均如下: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 對(duì)三種方法的比較: (1) 例 (1)和 (2)種方法執(zhí)行效率是相同的。即先計(jì)算元素地址。 (2) 第 (3)種方法比 (1)(2)法快,用指針變量直接指向元素,不必每次都重新計(jì)算地址,像 p++這樣的自加操作是比較快的。 (3) 用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素。用地址法或指針變量的方法不直觀,難以很快地判斷出當(dāng)前處理的是哪一個(gè)元素。 在使用指針變量時(shí),有幾個(gè)問(wèn)題要注意: (1) 指針變量可以實(shí)現(xiàn)使本身的值改變。如果不用 p而使 a變化 (例如,用 a++)行不行呢?假如將上述 (3)程序的最后兩行改為 for(p=a。a++) printf(%D, *a)。因?yàn)?a是數(shù)組名,它是數(shù)組首地址,它的值在程序運(yùn)行期間是固定不變的,是常量。 (2) 要注意指針變量的當(dāng)前值。 例 a數(shù)組的 10個(gè)元素。 p=a。i< 10。 printf(\n)。i< 10。 } 這個(gè)程序乍看起來(lái)好像沒有什么問(wèn)題。我們先看一下運(yùn)行情況: 1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483 顯然輸出的數(shù)值并不是 a數(shù)組中各元素的值。因此,在執(zhí)行第二個(gè) for循環(huán)時(shí), p的起始值不是 amp。 因?yàn)閳?zhí)行循環(huán)時(shí),每次要執(zhí)行 p++, p指向的是 a數(shù)組下面的 10個(gè)元素,而這些存儲(chǔ)單元中的值是不可預(yù)料的。解決這個(gè)問(wèn)題的辦法,只要在第二個(gè) for循環(huán)之前加一個(gè)賦值語(yǔ)句:使 p的初始值回到 amp。 main() { int p, i, a[10]。 for(i=0。i++) scanf(%D, p++)。 p=a。i< 10。 } 圖 運(yùn)行情況如下: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 (3) 從上例可以看到,雖然定義數(shù)組時(shí)指定它包含 10個(gè)元素,可以用 p指向當(dāng)前的數(shù)組元素。如果引用數(shù)組元素 a[10], C編譯程序并不認(rèn)為非法,系統(tǒng)把它按 *(a+10)處理,即先找出(a+10)的值 (是一個(gè)地址 ),然后找出它指向的單元的內(nèi)容。這種錯(cuò)誤比較隱蔽,初學(xué)者往往難以發(fā)現(xiàn)。 (4) 注意指針變量的運(yùn)算。若再執(zhí)行 *p,取出下一個(gè)元素 a[1]值。作用是先得到 p指向的變量的值 (即 *p),然后再使 p+1=p。i< 10。 可以改寫為 for(i=0。 作用完全一樣。這樣下一次循環(huán)時(shí), p就是下一個(gè)元素的值。前者是先取 *p值,后使 p加 1。若 p初值為a(即 amp。 ④ (*p)++表示 p所指向的元素值加 1,即 (a[0])++,如果 a[0]=3,則 (a[0])++的值為 4。 ⑤ 如果 p當(dāng)前指向 a數(shù)組中第 i個(gè)元素,則: (p)相當(dāng)于 a[i],先對(duì) p進(jìn)行“ *”運(yùn)算,再使 p自減。 (p)相當(dāng)于 a[i],先使 p自減,再作 *運(yùn)算。例如,想輸出 a數(shù)組 100個(gè)元素,可以: p=a。 {printf(%D, *p)。} 但如果不小心,很容易弄錯(cuò)。 用數(shù)組名作函數(shù)參數(shù) 數(shù)組名可以用作函數(shù)的形參和實(shí)參。 { … … f(array, 10)。在 ,當(dāng)用數(shù)組名作參數(shù)時(shí),如果形參數(shù)組中各元素 的值發(fā)生變化,實(shí)參數(shù)組元素的值隨之變化。先看數(shù)組元素作實(shí)參時(shí)的情況。 假設(shè)函數(shù)的作用是將兩個(gè)形參 (x, y) 的值交換,今有以下的函數(shù)調(diào)用: Swap(a[1], a[2])。當(dāng) x和 y的值改變時(shí), a[1]和 a[2]的值并不改變。前已介紹,實(shí)參數(shù)組名代表該數(shù)組首地址。因此,形參應(yīng)該是一個(gè)指針變量 (只有指針變量才能存放地址 )。例如,上面給出的函數(shù) f的形參是寫成數(shù)組形式的: f(int arr[ ], int n) 但在編譯時(shí)是將 arr按指針變量處理的,相當(dāng)于將函數(shù) f的首部寫成 f(int *arr, int n) 以上兩種寫法是等價(jià)的。如果在 f函數(shù)中用 sizeof運(yùn)算符測(cè)定 arr所占的字節(jié)數(shù) (即 size of arr的值 ),結(jié)果為 2。當(dāng) arr接收了實(shí)參數(shù)組的首地址后, arr就指向?qū)崊?shù)組的開頭,也就是指向 array[0]。 arr+1指向 array[1],arr+2指向 array[2], arr+3指向 array[3]。根據(jù)前面介紹過(guò)的知識(shí),*(arr+i)和 arr[i]是無(wú)條件等價(jià)的。這個(gè)道理與 的敘述是類似的。我們把用變量名作為函數(shù)參數(shù)和用數(shù)組名作為函數(shù)參數(shù)作一比較。 在用數(shù)組名作為函數(shù)實(shí)參時(shí),既然實(shí)際上相應(yīng)的形參是指針變量,為什么還允許使用形參數(shù)組的形式呢 ?這是因?yàn)樵?C語(yǔ)言中用下標(biāo)法和指針法都可以訪問(wèn)一個(gè)數(shù)組 (如果有一個(gè)數(shù)組 a,則 a[i]和 *(a+i)無(wú)條件等價(jià) ),用下標(biāo)法表示比較直觀,便于理解。從應(yīng)用的角度看,用戶可以認(rèn)為有一個(gè)形參數(shù)組,它從實(shí)參數(shù)組那里得到起始地址,因此形參數(shù)組與實(shí)參數(shù)組共占同一段內(nèi)存單元,在調(diào)用函數(shù)期間,如果改變了形參數(shù)組的值,也就是改變了實(shí)參數(shù)組的值。對(duì) C語(yǔ)言比較熟練的專業(yè)人員往往喜歡用指針變量作形參
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1