C語言程序設(shè)計 課件 第7章 指針_第1頁
C語言程序設(shè)計 課件 第7章 指針_第2頁
C語言程序設(shè)計 課件 第7章 指針_第3頁
C語言程序設(shè)計 課件 第7章 指針_第4頁
C語言程序設(shè)計 課件 第7章 指針_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

C語言程序設(shè)計第7章指針脈絡(luò)導(dǎo)圖C語言程序設(shè)計技能目標(biāo)C語言程序設(shè)計(1)具有分析問題、解決問題的能力和項(xiàng)目團(tuán)隊(duì)合作能力。(2)掌握C語言程序設(shè)計模塊化編程的思路。(3)掌握指針的定義和使用,以及指針作為函數(shù)參數(shù)的功能實(shí)現(xiàn)。(4)熟悉C語言中語法規(guī)則,具有程序運(yùn)行調(diào)試與維護(hù)能力。素質(zhì)目標(biāo)C語言程序設(shè)計(1)通過指針學(xué)習(xí),培養(yǎng)同學(xué)們高效處理問題的能力。(2)通過指針實(shí)現(xiàn)函數(shù)之間的共享變量或數(shù)據(jù)結(jié)構(gòu),培養(yǎng)同學(xué)們資源共享、團(tuán)隊(duì)合作的意識。7.1指針與指針變量C語言程序設(shè)計計算機(jī)硬件系統(tǒng)的內(nèi)存儲器中擁有大量的存儲單元,當(dāng)需要執(zhí)行磁盤上的某一可執(zhí)行程序時,操作系統(tǒng)負(fù)責(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)存地址”。指針的概念7.1指針與指針變量C語言程序設(shè)計“變量名”是給內(nèi)存空間取一個容易記憶的名稱,如同上網(wǎng)時的域名一樣,可方便用戶使用(實(shí)際上起作用的是IP地址);“變量地址”是系統(tǒng)分配給變量的內(nèi)存單元的起始地址;“變量值”是變量的地址所對應(yīng)的內(nèi)存單元中所存放的數(shù)值或內(nèi)容。變量名、變量地址和變量值7.1指針與指針變量C語言程序設(shè)計系統(tǒng)對變量的訪問形式可分為直接訪問和間接訪問。(1)直接訪問。要訪問變量必須通過地址找到該變量的存儲單元。由于通過地址可以找到變量單元,因此可以說一個地址“指向”一個變量存儲單元。例如,地址2000指向變量a,地址2002指向變量b等。這種通過變量名或地址訪問一個變量值的方式稱為“直接訪問”。(2)間接訪問?!伴g接訪問”方式是把一個變量的地址放在另一個變量中,利用這個“特殊”的變量進(jìn)行訪問。如圖7-2所示,“特殊”變量p存放的內(nèi)容是變量d的地址,利用變量p來訪問變量d的方法稱為“間接訪問”。變量的訪問形式7.1指針與指針變量C語言程序設(shè)計為了讓讀者更容易理解兩種訪問方式的實(shí)質(zhì)和不同,不妨再打個比喻。假設(shè)為了開一個A抽屜,共有兩種辦法:一種是將A的鑰匙帶在身上,需要時直接找出A的鑰匙打開抽屜,取出所需的東西,這相當(dāng)于直接訪問;另一種辦法是為了安全起見,將A的鑰匙放到另一個抽屜B中鎖起來,若需要打開A抽屜,就需要先找出B鑰匙,打開B抽屜后取出A鑰匙,然后再打開A抽屜,最后才能取出A抽屜中的所需之物,這就是“間接訪問”。兩種訪問方式的比較7.1指針與指針變量C語言程序設(shè)計名師點(diǎn)睛“指針”這個名詞是為了形象地表示訪問變量時的指引關(guān)系,不要認(rèn)為在內(nèi)存中真的有一個像時鐘似的“針”在移動。一般說的指針,習(xí)慣上是表示指針變量,它實(shí)際上只是存放了一個變量的地址而已。7.1指針與指針變量C語言程序設(shè)計存放地址的變量稱為指針變量。指針變量是一種特殊的變量,它不同于一般的變量,一般變量存放的是數(shù)據(jù)本身,而指針變量存放的是數(shù)據(jù)的地址。C語言規(guī)定所有變量在使用前都必須定義,系統(tǒng)會按數(shù)據(jù)類型分配內(nèi)存單元,所以指針變量必須定義為“指針類型”。指針變量定義一般格式如下:基類型 *指針變量名其中,“基類型”是該指針變量所指向的變量的類型,也就是指針變量所存儲變量地址的那個變量的類型。例如,int *p; float*point1; char*point2;,分別定義了基類型為整型、實(shí)型和字符型指針變量p、point1和point2。指針變量7.1指針與指針變量C語言程序設(shè)計名師點(diǎn)睛(1)定義變量時,指針變量前的“*”是一個標(biāo)志,表示該變量的類型為指針型變量。(2)指針變量存放某一類型變量的地址。而指針常量是指所引用的對象的地址不能改變的指針。7.1指針與指針變量C語言程序設(shè)計名師點(diǎn)睛(1)定義變量時,指針變量前的“*”是一個標(biāo)志,表示該變量的類型為指針型變量。(2)指針變量存放某一類型變量的地址。而指針常量是指所引用的對象的地址不能改變的指針。7.1指針與指針變量C語言程序設(shè)計在C語言中,用指針來表示一個變量指向另一個變量這樣的指向關(guān)系。那么如何使一個指針變量指向一個普通類型的變量呢?只要將需要指向的變量的地址賦給相依的指針變量即可。例如,int*p;int a=3;p=&a;就實(shí)現(xiàn)了指針變量p指向變量a。當(dāng)然,指針變量也可將定義說明與初始化賦值合二為一,則上面的情況也可用inta=3;int*p=&a;實(shí)現(xiàn)。在定義一個指針變量后,編譯器不會自動為其賦值,此時指針變量的值是不確定的。事實(shí)上,指針變量必須被賦值語句初始化后才能使用??罩羔楴ULL是一個特殊的值,將空指針賦值給一個指針變量后,說明該指針變量的值不再是不確定,而是一個有效值,只是不指向任何變量。指針變量只能接收地址。例如,int*p,a=100;p=a;賦值方法是錯誤的。指針變量的初始化和賦值7.1指針與指針變量C語言程序設(shè)計在C語言中,變量的地址是由編譯系統(tǒng)分配的,所以用戶是不知道變量的具體地址。(1)指針運(yùn)算符。取地址運(yùn)算符&。該運(yùn)算符是單目運(yùn)算符,其結(jié)合性為自右至左,其功能是取變量的地址。取內(nèi)容運(yùn)算符*。頁腳間接引用運(yùn)算符,其結(jié)合性為自右至左,用來表示指針變量所指的變量。在*運(yùn)算符后跟的變量必須是指針變量。指針變量的運(yùn)算C語言程序設(shè)計【例7-1】驗(yàn)證運(yùn)算符*和&的作用。運(yùn)行結(jié)果語句編寫

7.1指針與指針變量源代碼見教材52,1052,1065fe0c,65fe0865fe0c,65fe087.1指針與指針變量C語言程序設(shè)計允許用于指針的算術(shù)操作只有加法和減法。若有定義:intn,*p;,表達(dá)式p+n(n≥0)指向的是p所指的數(shù)據(jù)存儲單元之后的第n個數(shù)據(jù)存儲單元,而不是簡單地在指針變量p的值上直接加個數(shù)值n,其中數(shù)據(jù)存儲單元的大小與數(shù)據(jù)類型有關(guān)。若指針變量p1是整型的指針變量,其初始值為2000,整型的長度是2字節(jié),則表達(dá)式“p1++;”是將p1的值變成2002,而不是2001。每次增量之后,p1都會指向下一個單元。同理,當(dāng)p1的值為2000時,表達(dá)式“p1--;”將p1的值變成1998。指針變量的運(yùn)算7.1指針與指針變量C語言程序設(shè)計使用關(guān)系運(yùn)算符<、<=、>、>=、==和!=,可以比較指針值的大小。如果p和q是指向相同類型的指針變量,并且p和q指向同一段連續(xù)的存儲空間(如p和q都指向同一數(shù)組的元素),p的地址值小于q的值,則表達(dá)式p<q的結(jié)果為1,否則表達(dá)式p<q結(jié)果為0。參與比較的指針指向的空間一定在一個連續(xù)的空間內(nèi),比如都指向同一數(shù)組。指針變量的運(yùn)算C語言程序設(shè)計【例7-2】輸入a和b兩個整數(shù),按從大到小的順輸出兩個數(shù)。運(yùn)行結(jié)果語句編寫

7.1指針與指針變量程序說明:該程序定義了3個指針變量p、p1和p2,在比較過程中,不是直接交換a與b的值,而是通過交換指針變量的指向來實(shí)現(xiàn)的。最初指針變量p1和p2是分別指向變量a和b,當(dāng)a小于b時,通過交換指針指向,使指針變量p1轉(zhuǎn)而指向b,p2指向了a。源代碼見教材37a=3,b=7max=7,min=37.1指針與指針變量C語言程序設(shè)計函數(shù)的參數(shù)不僅可以是整型、實(shí)型和字符型,還可以是指針類型。當(dāng)是指針類型時,它的作用是將一個變量的地址傳送到另一個函數(shù)中。在C語言中,函數(shù)參數(shù)的傳遞時單向值傳遞。數(shù)值只能從調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞,不能反過來傳遞,形參值的改變不會反過來影響實(shí)參的改變。例7-3就試圖用一個被調(diào)函數(shù)實(shí)現(xiàn)主調(diào)函數(shù)中變量值的改變,但這是無法實(shí)現(xiàn)的。指針變量作函數(shù)的參數(shù)C語言程序設(shè)計【例7-3】試圖交換變量值的程序。運(yùn)行結(jié)果語句編寫

7.1指針與指針變量程序說明:此例中,i和j的值正確傳入了swap()函數(shù)中,a和b是swap()函數(shù)的兩個形參。a和b的值是由i和j復(fù)制得到的,是i和j的一個副本。在swap()函數(shù)調(diào)用返回時,a和b兩個形參的生命周期結(jié)束,但它們的值并沒有被復(fù)制回實(shí)參i和j中。因此,一旦返回,i和j的值將保持不變,swap()函數(shù)的交換功能也沒有得到體現(xiàn)。源代碼見教材beforecalling:i=133j=58inthefunctionswap:a=58b=133aftercalling:i=133j=587.1指針與指針變量C語言程序設(shè)計解決問題的方法是用指針作為函數(shù)參數(shù),傳給swap()函數(shù)的應(yīng)是想交換的兩個變量的地址,而地址可用指針來實(shí)現(xiàn)。解決方法C語言程序設(shè)計【例7-4】使用指針參數(shù)將改變帶回到調(diào)用函數(shù)。運(yùn)行結(jié)果語句編寫

7.1指針與指針變量程序說明:使用指針作為參數(shù),函數(shù)改變參數(shù)的值后,能將改變帶回到調(diào)用函數(shù)。swap()函數(shù)的參數(shù)是兩個指向整型變量的指針變量。所以main()函數(shù)在調(diào)用時必須使用&i、&j來傳遞參數(shù)。源代碼見教材beforecalling:i=133j=58inthefunctionswap:*a=58*b=133aftercalling:i=58j=133C語言程序設(shè)計【例7-5】輸入a、b和c三個數(shù),按由大到小的順序輸出。運(yùn)行結(jié)果語句編寫

7.1指針與指針變量程序說明:這里限定了swap()函數(shù)、exchange()函數(shù)的返回類型是void,因此,要得到輸出值就務(wù)必傳遞一個數(shù)值的地址??傊粝Mㄟ^函數(shù)調(diào)用改變一個或多個變量的值,可以采用傳送相應(yīng)變量地址的方法。源代碼見教材78173378,33,177.2指針變量的應(yīng)用C語言程序設(shè)計一個變量有地址,一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存單元中占用存儲單元,它們都有相應(yīng)的首地址。數(shù)組名是數(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ù)組的指針變量7.2指針變量的應(yīng)用C語言程序設(shè)計數(shù)組中各個元素的地址又是如何計算和表示的呢?如果有一個數(shù)組a,其定義為:inta[5]={1,3,5,7,9};,元素a[0]的地址是a的值(即1010),元素a[1]的地址是a+1。同理,a+i是元素a[i]的地址。值得特別注意的是,此處的a+i并非簡單的在首地址a上加個數(shù)字i,編譯系統(tǒng)計算實(shí)際地址時,a+i中的i要乘上數(shù)組元素所占的字節(jié)數(shù),即實(shí)際地址=a+i×單個元素所占的字節(jié)數(shù)。其中,單個元素所占的字節(jié)數(shù)由數(shù)據(jù)類型決定。指向一維數(shù)組的指針變量7.2指針變量的應(yīng)用C語言程序設(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的指針變量。指向一維數(shù)組的指針變量C語言程序設(shè)計【例7-6】用下標(biāo)法輸出數(shù)組中的全部元素。運(yùn)行結(jié)果語句編寫

7.2指針變量的應(yīng)用源代碼見教材a[0]=0a[1]=1a[2]=2a[3]=3a[4]=4C語言程序設(shè)計【例7-7】用指針法輸出數(shù)組中的全部元素。運(yùn)行結(jié)果語句編寫

7.2指針變量的應(yīng)用源代碼見教材a[0]=0a[1]=1a[2]=2a[3]=3a[4]=47.2指針變量的應(yīng)用C語言程序設(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)。通過指針引用數(shù)組元素7.2指針變量的應(yīng)用C語言程序設(shè)計名師點(diǎn)睛1)數(shù)組名是指針變量,始終是指向數(shù)組的首地址;而指針是一個變量,可以實(shí)現(xiàn)本身值的改變。如有數(shù)組a和指針變量p,則以下語句是合法的。p=a;p++;p+=3;而“a++;”與“a=p”都是錯誤的。(2)在使用中應(yīng)注意*(p++)與*(++p)的區(qū)別。若p的初值為a,則*(p++)的值等價于a[0],*(++p)等價于a[1],而(*p)++表示p所指向的元素值加1。如果p當(dāng)前指向a數(shù)組中的第i個元素,則有:“*(p--);”等價于“a[i--];”;“*(++)p;”等價于“a[++i];”;“*(--p);”等價于“a[--i];”。C語言程序設(shè)計【例7-8】分析程序的運(yùn)行結(jié)果。運(yùn)行結(jié)果語句編寫

7.2指針變量的應(yīng)用程序說明:從程序運(yùn)行結(jié)果中可以看出,a[i]、*(a+i)和*p輸出的結(jié)果都是相同的。源代碼見教材2468102468102468107.2指針變量的應(yīng)用C語言程序設(shè)計指向字符串的指針稱為字符串的指針,其類型是char*或unsignedchar*。實(shí)際上,只要知道字符串的首地址的指針,就可以通過指針的移動來存取字符串中的每一個字符,直至移動到字符串結(jié)束標(biāo)志'\0',因此可以用字符串指針來表示字符串。用字符數(shù)組來存儲字符串時,數(shù)組的指針就是字符串指針。指向字符串的指針變量C語言程序設(shè)計【例7-9】字符數(shù)組的應(yīng)用。運(yùn)行結(jié)果語句編寫

7.2指針變量的應(yīng)用程序說明:字符數(shù)組s長度沒有明確定義,默認(rèn)的長度是字符串中字符個數(shù)加1的和(結(jié)束標(biāo)志占一個字符位),s數(shù)組的長度應(yīng)該是14。s是數(shù)組名,表示字符數(shù)組首地址;s+4表示序號為4的元素的地址,指向字符'k'。s[4]與*(s+4)表示數(shù)組中序號為4的元素的值(k)。字符數(shù)組允許用%s格式進(jìn)行整體輸出。源代碼見教材ILoveChina!C語言程序設(shè)計【例7-10】字符指針的應(yīng)用。運(yùn)行結(jié)果語句編寫

7.2指針變量的應(yīng)用程序說明:C程序?qū)⒆址A?ILoveChina!"按字符數(shù)組處理,在內(nèi)存中開辟一個字符數(shù)組來存放字符串常量,并把字符數(shù)組的首地址賦值給字符指針變量s。源代碼見教材ILoveChina!C語言程序設(shè)計【例7-11】用字符指針指向一個字符串。運(yùn)行結(jié)果語句編寫

7.2指針變量的應(yīng)用程序說明:程序中定義了一個字符數(shù)組string,并對它進(jìn)行了賦初值。p是指向字符數(shù)據(jù)的指針變量,將string數(shù)組的起始地址賦給p,p也指向了字符串。最后,程序以“%s”格式輸出string和p,從給定的地址開始逐個字符輸出,直到遇到'\0'為止。結(jié)果都是輸出字符串"ILoveChina!"。源代碼見教材ILoveChina!ILoveChina!7.2指針變量的應(yīng)用C語言程序設(shè)計使用字符數(shù)組和字符指針都能處理字符串,但二者之間是有區(qū)別的,主要表現(xiàn)在以下3個方面。(1)字符數(shù)組由若干個元素組成,每個元素中放一個字符,若用來處理字符串,則必須保證有串結(jié)束符。而字符指針變量用來存放字符串的首地址(若未進(jìn)行初始化,則它指向的地址是不確定的),不是用來存放整個字符串內(nèi)容的。(2)賦值方式不完全相同,字符數(shù)組只能對各個元素賦值,不能整體賦值。(3)在說明一個字符數(shù)組后,其地址是確定的,而說明一個字符指針變量時,指針變量的值是可以改變的。指向字符串的指針變量C語言程序設(shè)計【例7-12】編程實(shí)現(xiàn)刪除有序數(shù)組中重復(fù)元素。運(yùn)行結(jié)果語句編寫

7.2指針變量的應(yīng)用程序說明:首先遍歷整個數(shù)組,統(tǒng)計出重復(fù)元素的位置和個數(shù),然后通過移動指針刪除重復(fù)元素。源代碼見教材12344456671234567C語言程序設(shè)計【例7-13】統(tǒng)計其中大寫字母、小寫字母、數(shù)字、控制及其他字符的個數(shù)。運(yùn)行結(jié)果語句編寫

7.2指針變量的應(yīng)用程序說明:輸入一個字符串后,可將一個字符型指針p指向該字符串首地址。當(dāng)p所指字符不能與字符串結(jié)束標(biāo)志'\0'不相等時,使用復(fù)合if語句判斷p所指字符是哪類字符,然后將對應(yīng)的變量自加,然后將指針P后移。直到循環(huán)結(jié)束,輸出這些字符個數(shù)即可。源代碼見教材請輸入一個字符串(不要超過100個字符):WinterDream-EmblemoftheOlympicWinterGamesBeijing2022該字符串中大寫字母個數(shù)為:7該字符串中小寫字母個數(shù)為:40該字符串中數(shù)字個數(shù)為:4該字符串中空格個數(shù)為:10該字符串中其他字符個數(shù)為:17.3常見錯誤分析C語言程序設(shè)計對指針變量賦予非指針值#include<stdio.h>intmain(){ inti=10,*p; p=i; /*對指針變量賦予非指針值*/ printf("%d",*p); return0;}7.3常見錯誤分析C語言程序設(shè)計指針未能指向確定的存儲區(qū)#include<stdio.h>intmain(){ char*str; scanf("%s",str); /*企圖從鍵盤輸入一個字符串,使str指向該字符串*/ printf("%s",str); retur

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論