版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C語言程序設(shè)計教案第7章指針授課內(nèi)容第7章指針任課教師授課形式理實一體任課班級教學(xué)方法本節(jié)采用以教師為主導(dǎo),在教學(xué)過程中同時采用提問法、討論法和互動式教學(xué)方法。教學(xué)重點(1)了解指針的概念。(2)掌握指針的定義。(3)掌握指針的引用。(4)了解數(shù)組與指針的使用,掌握指向數(shù)組的指針的使用方法。教學(xué)難點(1)指針的理解和運用。(2)指針與數(shù)組的理解和運用。教學(xué)目標(biāo)教學(xué)目標(biāo)(1)熟練掌握二維數(shù)組的定義、初始化及數(shù)組元素的引用。(2)能夠根據(jù)實際情況恰當(dāng)?shù)剡\用二維數(shù)組解決實際問題。技能目標(biāo)(1)具有分析問題、解決問題的能力和項目團隊合作能力。(2)掌握C語言程序設(shè)計模塊化編程的思路。(3)掌握指針的定義和使用,以及指針作為函數(shù)參數(shù)的功能實現(xiàn)。(4)熟悉C語言中語法規(guī)則,具有程序運行調(diào)試與維護能力。素質(zhì)目標(biāo)(1)通過指針學(xué)習(xí),培養(yǎng)同學(xué)們高效處理問題的能力。(2)通過指針實現(xiàn)函數(shù)之間的共享變量或數(shù)據(jù)結(jié)構(gòu),培養(yǎng)同學(xué)們資源共享、團隊合作的意識。思政目標(biāo)通過指針的教學(xué),揭示理解事物內(nèi)在聯(lián)系,才能了解事物的本質(zhì)。教學(xué)步驟及內(nèi)容教學(xué)步驟及內(nèi)容教學(xué)步驟及內(nèi)容教學(xué)步驟及內(nèi)容教學(xué)步驟及內(nèi)容教學(xué)步驟及內(nèi)容教學(xué)步驟及內(nèi)容教學(xué)步驟及內(nèi)容:教學(xué)過程:復(fù)習(xí)舊課導(dǎo)出新課問題1:內(nèi)存是什么?問題2:內(nèi)存如何工作?問題3:變量如何在內(nèi)存中存儲?教師總結(jié):可以存放內(nèi)存地址的變量是指針,存儲在指針中的地址是另一個變量的首地址。我們可以定義指針變量p,存放變量sum的首地址,變量sum是一個值為0的整型變量。存儲在p中的地址是sum的第一個字節(jié)的地址。講授新課7.1指針與指針變量7.1.1指針的概念1.內(nèi)存地址計算機硬件系統(tǒng)的內(nèi)存儲器中擁有大量的存儲單元,當(dāng)需要執(zhí)行磁盤上的某一可執(zhí)行程序時,操作系統(tǒng)負責(zé)將它調(diào)入內(nèi)存。具體地說,內(nèi)存中存放了程序中的語句、函數(shù)、常量、變量等。不同的語句、函數(shù)、常量、變量在內(nèi)存中的位置是不同的。一般把存儲器中的1字節(jié)稱為一個內(nèi)存單元,不同的數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)不等。為了正確地訪問這些內(nèi)存單元,必須為每個內(nèi)存單元編號,然后根據(jù)內(nèi)存單元的編號即可準(zhǔn)確地找到該內(nèi)存單元。內(nèi)存單元的編號也叫作“內(nèi)存地址”。每個存儲單元都有唯一的地址,就如同每個人都需要一個身份證號碼、宿舍樓中的每一個房間需要房間編號、電影院中的每個座位需要一個座位號一樣,否則無法管理。2.變量名、變量地址和變量值“變量名”是給內(nèi)存空間取一個容易記憶的名稱,如同上網(wǎng)時的域名一樣,可方便用戶使用(實際上起作用的是IP地址);“變量地址”是系統(tǒng)分配給變量的內(nèi)存單元的起始地址;“變量值”是變量的地址所對應(yīng)的內(nèi)存單元中所存放的數(shù)值或內(nèi)容。為了幫助讀者理解三者之間聯(lián)系與區(qū)別,不妨舉個例子。假如有一幢教師辦公樓,各房間都有一個編號,如1001、1002、1003……一旦各房間被分配給相應(yīng)的院系部門后,各房間就掛起了部門名稱牌,如電子信息系、汽車工程系、工商管理系、旅游藝術(shù)系等。假設(shè)電子信息系被分配在1001房間,若要找電子信息系的教師(即值或內(nèi)容),可以取電子信息系找(按名稱找),也可以去1001房間找(按地址找)。類似地,對一個存儲空間的訪問既可以指出它的名稱,也可以指出它的地址。凡在程序中定義的變量,當(dāng)程序編譯時,系統(tǒng)都會給它們分配相應(yīng)的存儲單元。計算機的C語言系統(tǒng)給整型變量分配2字節(jié),給浮點型變量分配4字節(jié)。每個變量所占的存儲單元都有確定的地址,具體的地址是在編譯時分配的。3.變量的訪問形式系統(tǒng)對變量的訪問形式可分為直接訪問和間接訪問。(1)直接訪問。要訪問變量必須通過地址找到該變量的存儲單元。由于通過地址可以找到變量單元,因此可以說一個地址“指向”一個變量存儲單元。例如,地址2000指向變量a,地址2002指向變量b等。這種通過變量名或地址訪問一個變量值的方式稱為“直接訪問”。(2)間接訪問。“間接訪問”方式是把一個變量的地址放在另一個變量中,利用這個“特殊”的變量進行訪問。如圖7-2所示,“特殊”變量p存放的內(nèi)容是變量d的地址,利用變量p來訪問變量d的方法稱為“間接訪問”。3.兩種訪問方式的比較為了讓讀者更容易理解兩種訪問方式的實質(zhì)和不同,不妨再打個比喻。假設(shè)為了開一個A抽屜,共有兩種辦法:一種是將A的鑰匙帶在身上,需要時直接找出A的鑰匙打開抽屜,取出所需的東西,這相當(dāng)于直接訪問;另一種辦法是為了安全起見,將A的鑰匙放到另一個抽屜B中鎖起來,若需要打開A抽屜,就需要先找出B鑰匙,打開B抽屜后取出A鑰匙,然后再打開A抽屜,最后才能取出A抽屜中的所需之物,這就是“間接訪問”。7.1.2指針變量1.指針變量的定義存放地址的變量稱為指針變量。指針變量是一種特殊的變量,它不同于一般的變量,一般變量存放的是數(shù)據(jù)本身,而指針變量存放的是數(shù)據(jù)的地址。C語言規(guī)定所有變量在使用前都必須定義,系統(tǒng)會按數(shù)據(jù)類型分配內(nèi)存單元,所以指針變量必須定義為“指針類型”。指針變量定義一般格式如下:基類型 *指針變量名其中,“基類型”是該指針變量所指向的變量的類型,也就是指針變量所存儲變量地址的那個變量的類型。例如,int *p; float*point1; char*point2;,分別定義了基類型為整型、實型和字符型指針變量p、point1和point2。有了這些定義,則指針變量p只能存儲int類型變量的地址,point1只能存儲float類型變量的地址,point2只能存儲字符型變量的地址。2.指針變量的初始化和賦值在C語言中,用指針來表示一個變量指向另一個變量這樣的指向關(guān)系。那么如何使一個指針變量指向一個普通類型的變量呢?只要將需要指向的變量的地址賦給相依的指針變量即可。例如,int*p;int a=3;p=&a;就實現(xiàn)了指針變量p指向變量a。當(dāng)然,指針變量也可將定義說明與初始化賦值合二為一,則上面的情況也可用inta=3;int*p=&a;實現(xiàn)。在定義一個指針變量后,編譯器不會自動為其賦值,此時指針變量的值是不確定的。事實上,指針變量必須被賦值語句初始化后才能使用,否則,直接使用會帶來內(nèi)存錯誤。指針可被初始化為0、NULL或某個地址,具有值為NULL的指針不指向任何值,NULL是在頭文件<stdio.h>(以及其他幾個頭文件)中定義的符號常量。把一個指針初始化為0,等價于把它初始化為NULL??罩羔楴ULL是一個特殊的值,將空指針賦值給一個指針變量后,說明該指針變量的值不再是不確定,而是一個有效值,只是不指向任何變量。指針變量只能接收地址。例如,int*p,a=100;p=a;賦值方法是錯誤的。3.指針變量的運算前面曾談到指針變量同普通變量一樣,使用之前不僅要定義說明,而且必須賦予具體的值,未經(jīng)賦值的指針變量不能使用,否則將造成系統(tǒng)混亂,甚至死機。指針變量的賦值只能賦予地址,絕不能賦予任何其他數(shù)據(jù),否則也將會引起錯誤。在C語言中,變量的地址是由編譯系統(tǒng)分配的,所以用戶是不知道變量的具體地址。(1)指針運算符。取地址運算符&。該運算符是單目運算符,其結(jié)合性為自右至左,其功能是取變量的地址。取內(nèi)容運算符*。頁腳間接引用運算符,其結(jié)合性為自右至左,用來表示指針變量所指的變量。在*運算符后跟的變量必須是指針變量。(2)指針變量的算術(shù)操作。允許用于指針的算術(shù)操作只有加法和減法。若有定義:intn,*p;,表達式p+n(n≥0)指向的是p所指的數(shù)據(jù)存儲單元之后的第n個數(shù)據(jù)存儲單元,而不是簡單地在指針變量p的值上直接加個數(shù)值n,其中數(shù)據(jù)存儲單元的大小與數(shù)據(jù)類型有關(guān)。若指針變量p1是整型的指針變量,其初始值為2000,整型的長度是2字節(jié),則表達式“p1++;”是將p1的值變成2002,而不是2001。每次增量之后,p1都會指向下一個單元。同理,當(dāng)p1的值為2000時,表達式“p1--;”將p1的值變成1998。(3)指針值的比較。使用關(guān)系運算符<、<=、>、>=、==和!=,可以比較指針值的大小。如果p和q是指向相同類型的指針變量,并且p和q指向同一段連續(xù)的存儲空間(如p和q都指向同一數(shù)組的元素),p的地址值小于q的值,則表達式p<q的結(jié)果為1,否則表達式p<q結(jié)果為0。參與比較的指針指向的空間一定在一個連續(xù)的空間內(nèi),比如都指向同一數(shù)組。7.1.3指針變量作函數(shù)的參數(shù)1.問題的提出函數(shù)的參數(shù)不僅可以是整型、實型和字符型,還可以是指針類型。當(dāng)是指針類型時,它的作用是將一個變量的地址傳送到另一個函數(shù)中。在C語言中,函數(shù)參數(shù)的傳遞時單向值傳遞。數(shù)值只能從調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞,不能反過來傳遞,形參值的改變不會反過來影響實參的改變。2.解決方法解決問題的方法是用指針作為函數(shù)參數(shù),傳給swap()函數(shù)的應(yīng)是想交換的兩個變量的地址,而地址可用指針來實現(xiàn)。7.2指針變量的應(yīng)用7.2.1指向一維數(shù)組的指針變量1.一維數(shù)組指針的概念在C語言中,指針和數(shù)組有著極為密切的聯(lián)系。數(shù)組處理的是一些具有相同類型的元素,指針也能做同樣的工作,兩者相比而言,數(shù)組表示法容易理解,適合于初學(xué)者,而指針表示法則有利于提高程序的執(zhí)行效率。一個變量有地址,一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存單元中占用存儲單元,它們都有相應(yīng)的首地址。數(shù)組名是數(shù)組的首地址(不能說是數(shù)組元素的首地址),針對同一個數(shù)組來說,它是一個常量。所謂數(shù)組的指針,是指數(shù)組的起始地址,事實上也就是數(shù)組名。一個數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的,數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址。一個數(shù)組也是由各個數(shù)據(jù)元素(下標(biāo)變量)組成的,每個數(shù)組元素按其類型的不同占用不同個數(shù)的連續(xù)的內(nèi)存單元,指針變量既然可以指向一般變量,當(dāng)然也可以指向數(shù)據(jù)元素,數(shù)組元素的指針是數(shù)組元素的地址。一個數(shù)組元素的首地址也是指它所占用的幾個內(nèi)存單元的首地址。在此只討論一維數(shù)組的指針,若需要學(xué)習(xí)多維數(shù)組的指針,可參考C語言的其他相關(guān)書籍。2.一維數(shù)組的指針表示方法前面已經(jīng)介紹過,數(shù)組名代表該數(shù)組的起始地址。那么,數(shù)組中各個元素的地址又是如何計算和表示的呢?如果有一個數(shù)組a,其定義為:inta[5]={1,3,5,7,9};,數(shù)組a的元素在內(nèi)存中的分配如圖7-3所示??梢钥闯?,元素a[0]的地址是a的值(即1010),元素a[1]的地址是a+1。同理,a+i是元素a[i]的地址。值得特別注意的是,此處的a+i并非簡單的在首地址a上加個數(shù)字i,編譯系統(tǒng)計算實際地址時,a+i中的i要乘上數(shù)組元素所占的字節(jié)數(shù),即實際地址=a+i×單個元素所占的字節(jié)數(shù)。其中,單個元素所占的字節(jié)數(shù)由數(shù)據(jù)類型決定。3.一維數(shù)組元素的引用方法為了引用一個數(shù)組元素,可以用兩種不同的方法:一種是下標(biāo)法,即指出數(shù)組名和下標(biāo)值,系統(tǒng)會找到該元素。例如,a[3];另一種方法是指針法,也叫地址法,就是通過給出的數(shù)組元素地址訪問某一元素。例如,通過地址a+3可以找到數(shù)組元素a[3],而*(a+3)的值就是元素a[3]的值。(1)下標(biāo)法。用a[i]的形式訪問數(shù)組元素。前面介紹數(shù)組時都采用的這種方法。(2)指針法采用*(a+i)或*(p+i)的形式,用間接訪問的方法來訪問數(shù)組元素,其中a是數(shù)組名,p是指向數(shù)組a的指針變量。4.通過指針引用數(shù)組元素C語言規(guī)定:若p為指向某一數(shù)組的指針變量,則p+1指向同一數(shù)組中的下一個元素。例如,intarray[10],*pointer=array;,則:(1)pointer+i和array+i都是數(shù)組元素array[i]的地址,如圖7-4所示。(2)*(pointer+i)和*(array+i)就是數(shù)組元素array[i]。(3)指向數(shù)組的指針變量被賦值為數(shù)組名后也可按下標(biāo)法來使用。例如,array[i]等價于*(pointer+i)。7.2.2指向字符串的指針變量1.字符數(shù)組和字符指針字符串實際上是內(nèi)存中一段連續(xù)的字節(jié)單元中存儲的字符的總和,最后用'\0'作為結(jié)束標(biāo)志。前面已經(jīng)講過,字符串與字符串?dāng)?shù)組是密切相關(guān)的,而數(shù)組又與指針密切相關(guān),因此,字符串與指針也密切相關(guān)。指向字符串的指針稱為字符串的指針,其類型是char*或unsignedchar*。實際上,只要知道字符串的首地址的指針,就可以通過指針的移動來存取字符串中的每一個字符,直至移動到字符串結(jié)束標(biāo)志'\0',因此可以用字符串指針來表示字符串。例如,char*s="hello";,其中,s是字符串指針,在指向語句時,系統(tǒng)為字符串"hello"分配6字節(jié)的空間,同時把字符串的首地址(即字符'h'的地址)賦值給s指針變量。上述語句也可以寫成:chars[]="hello";用字符數(shù)組來存儲字符串時,數(shù)組的指針就是字符串指針。在語句“chars[]="hello";”中,通過s指針可以訪問到任何一個字符單元。例如,i是一個整數(shù)下標(biāo),則s[i]與*(s+i)是同一元素,&s[i]與s+i是同一個地址。C語言程序可以允許使用兩種方法實現(xiàn)一個字符串的引用。(1)字符數(shù)組。2.利用字符指針處理字符串7.2.3指針變量應(yīng)用示例7.3常見錯誤分析7.3.1對指針變量賦予非指針值由于指針變量是指針類型,因此,所賦的值應(yīng)是一個地址值。不能對指針變量賦予非地址值。7.3.2指針未能指向確定的存儲區(qū)若定義了字符指針變量,應(yīng)及時把一個字符變量(或字符數(shù)組元素)的地址賦給它,使它指向一個字符型數(shù)據(jù)。若未對它賦予一個地址值,它并未具體指向一個確定的對象。此時若向該指針變量所指向的對象輸入數(shù)據(jù),可能會出現(xiàn)嚴(yán)重的后果。7.3.3混淆數(shù)組名與指針變量的區(qū)別指針變量可以實現(xiàn)本身值的改變,如p++是合法的,初學(xué)者容易混淆數(shù)組名與指針變量的區(qū)別。7.3.4不同數(shù)據(jù)類型的指針混用指針之間賦值時需要注意其數(shù)據(jù)類型是否相同。7.4指針綜合應(yīng)用實戰(zhàn)7.4.1實戰(zhàn)背景為促進學(xué)生全面發(fā)展,各大高校每年都會對在德、智、體、美、勞等方面全面發(fā)展或者在思想品德、學(xué)習(xí)成績、科技創(chuàng)造、體育競賽、文藝活動、志愿服務(wù)及社會實踐等方面有突出表現(xiàn)的學(xué)生,給予表彰和獎勵。這種表彰和獎勵的評選過程被稱為獎學(xué)金評定。高校在評定獎學(xué)金時,主要考查學(xué)生品德修養(yǎng)、學(xué)業(yè)總評和社會實踐三個模塊的成績,其中最重要的是學(xué)生的思想品德修養(yǎng)。7.4.2實戰(zhàn)目的(1)能夠編寫形參為指針的函數(shù)。(2)能夠分析形參為指針、實參為一維數(shù)組的函數(shù)中指針與數(shù)據(jù)之間的指向關(guān)系。7.4.3實戰(zhàn)內(nèi)容編寫程序,對班級同學(xué)“品德修養(yǎng)”課程成績進行查找,找到最高分的同學(xué),輸出其學(xué)號和分?jǐn)?shù)。7.4.4實戰(zhàn)過程#include<stdio.h>#defineN35voidFindMax(int*p,long*q,intn,int*pMaxScore,long*pMaxNum);intmain(){longnum[N],maxNum;intscore[N],maxScore;intn,i;printf("請輸入學(xué)生人數(shù):"); scanf("%d",&n);printf("請輸入學(xué)生學(xué)號和“品德修養(yǎng)”課程成績:\nfor(i=0;i<n;i++) scanf("%d%d",&num[i],&score[i]);FindMax(score,num,n,&maxScore,&maxNum);printf("“品德修養(yǎng)”課程最高分是:%d\n",maxScore);printf("“思想品德”
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度差旅服務(wù)與智能出行平臺合作協(xié)議4篇
- 專業(yè)化國內(nèi)物流服務(wù)運輸協(xié)議范本(2024版)一
- 2025年度建筑工程測量監(jiān)理合同協(xié)議4篇
- 2024新三板掛牌協(xié)議及證券事務(wù)顧問服務(wù)合同3篇
- 2024藍皮合同下載
- 2025年度柴油運輸企業(yè)環(huán)保設(shè)施建設(shè)合同4篇
- 2025年度環(huán)保環(huán)保設(shè)備銷售與售后服務(wù)合同4篇
- 2025年度柴油生產(chǎn)技術(shù)改造項目合同范本4篇
- 個人房產(chǎn)買賣合同書稿版B版
- 2024投資擔(dān)保借款保證合同范本
- 產(chǎn)品共同研發(fā)合作協(xié)議范本5篇
- 風(fēng)水學(xué)的基礎(chǔ)知識培訓(xùn)
- 吸入療法在呼吸康復(fù)應(yīng)用中的中國專家共識2022版
- 1-35kV電纜技術(shù)參數(shù)表
- 信息科技課程標(biāo)準(zhǔn)測(2022版)考試題庫及答案
- 施工組織設(shè)計方案針對性、完整性
- 2002版干部履歷表(貴州省)
- DL∕T 1909-2018 -48V電力通信直流電源系統(tǒng)技術(shù)規(guī)范
- 2024年服裝制版師(高級)職業(yè)鑒定考試復(fù)習(xí)題庫(含答案)
- 門診部縮短就診等候時間PDCA案例-課件
評論
0/150
提交評論