《C語(yǔ)言程序設(shè)計(jì)》課件4第11章_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件4第11章_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件4第11章_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件4第11章_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件4第11章_第5頁(yè)
已閱讀5頁(yè),還剩75頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第11章指針11.1變量的指針11.2指針變量11.3指針變量的使用11.4指針與數(shù)組11.5字符串與指針11.6指向函數(shù)的指針11.7返回指針值的函數(shù)11.8指針數(shù)組11.9鏈表11.10有關(guān)指針的數(shù)據(jù)類型小結(jié)

11.1變?量?的?指?針

為了正確地訪問(wèn)這些內(nèi)存單元,必須為每個(gè)內(nèi)存單元編號(hào)。根據(jù)一個(gè)內(nèi)存單元的編號(hào)就可以準(zhǔn)確地找到該內(nèi)存單元。因此內(nèi)存區(qū)的每一個(gè)字節(jié)都有一個(gè)編號(hào),這就是地址,通俗地說(shuō),它相當(dāng)于旅館中的房間號(hào);在地址所標(biāo)志的內(nèi)存單元中存放數(shù)據(jù),這就相當(dāng)于每個(gè)房間中居住旅客一樣。內(nèi)存單元的地址與內(nèi)容兩個(gè)概念的區(qū)別如圖11.1所示。圖11.1內(nèi)存用戶數(shù)據(jù)區(qū)數(shù)據(jù)存儲(chǔ)示例

【例11-1】顯示變量的值及地址。圖11.2例11-1運(yùn)行結(jié)果

11.2指針變量

1.間接訪問(wèn)形式

假設(shè)定義了一個(gè)變量i_pointer,用來(lái)存放整型變量的地址,它被分配內(nèi)存地址為3010、3011的字節(jié)單元??梢酝ㄟ^(guò)下面的語(yǔ)句將i的地址(2000)存放到i_pointer中:

i_pointer=&i;

2.間接訪問(wèn)方式和直接訪問(wèn)方式的對(duì)比

例如,為了打開(kāi)A抽屜,有兩種辦法:一種是將A鑰匙隨身攜帶,需要時(shí)直接找出該鑰匙打開(kāi)抽屜,取出所需的東西;另一種辦法是將A鑰匙放到另一抽屜B中鎖起來(lái)。如果需要打開(kāi)A抽屜,就需要先找出B鑰匙,打開(kāi)B抽屜,取出A鑰匙,再打開(kāi)A抽屜,取出A抽屜中的物品,這就是間接訪問(wèn)。

圖11.3是直接訪問(wèn)和間接訪問(wèn)的示意圖。圖11.3直接訪問(wèn)和間接訪問(wèn)的示意圖

3.間接訪問(wèn)運(yùn)算符“*”

為了表示指針變量和它所指向的變量的聯(lián)系,在程序中用“*”符號(hào)表示“指向”關(guān)系。例如,i_pointer代表指針變量,而*i_pointer是i_pointer所指向的變量,如圖11.4所示。圖11.4指針變量示意圖

11.3指針變量的使用

11.3.1指針變量的定義

C語(yǔ)言規(guī)定所有變量在使用前必須定義,指定其類型,并按此分配內(nèi)存單元。指針變量不同于整型變量和其他類型的變量,它是專門用來(lái)存放地址的,必須將它定義為指針類型。那么指針變量該如何定義呢?例如:

inti,j;

int*pointer_1,*pointer_2;圖11.5將變量地址存放到指針變量中11.3.2指針變量的引用

指針變量中只能存放地址(指針),不要將一個(gè)整型量(或任何其他非地址類型的數(shù)據(jù))賦給一個(gè)指針變量。例如,下面的賦值是不合法的:

pointer_1=100;

/*pointer_1是指針變量,100為整數(shù)*/

【例11-2】通過(guò)指針變量訪問(wèn)整型變量。圖11.6例11-2運(yùn)行結(jié)果圖11.7例11-2示意圖11.3.3運(yùn)算符“&”和“*”的結(jié)合方向

【例11-3】輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出a和b。圖11.8例11-3的運(yùn)行結(jié)果代碼說(shuō)明:當(dāng)輸入a=2,b=9時(shí),由于a<b,將p1和p2交換。交換前的情況如圖11.9(a)所示,交換后的情況如圖11.9(b)所示。圖11.9p1和p2交換前后示意圖11.3.4指針變量作函數(shù)參數(shù)

【例11-4】輸入兩個(gè)整數(shù),按大小輸出(指針變量作函數(shù)參數(shù))。圖11.10例11-4運(yùn)行結(jié)果圖11.11例11-3執(zhí)行過(guò)程中變量交換示意圖圖11.12值的單向傳遞圖11.13變量交換示意圖11.4指?針?與?數(shù)?組

11.4.1指向數(shù)組元素的指針

定義一個(gè)指向數(shù)組元素的指針變量的方法,與前面介紹的指向變量的指針變量相同。例如:

inta[10];/*定義a為包含10個(gè)整型數(shù)據(jù)的數(shù)組*/

int*p;/*定義p為指向整型變量的指針變量*/下面是給指針變量p賦值:

p=&a[0]; /*將a[0]元素的地址賦給指針變量p,

也就是說(shuō),指針變量p指向?數(shù)組下標(biāo)

為0的元素,如圖11.14所示*/圖11.14指向數(shù)組元素的指針11.4.2通過(guò)指針引用數(shù)組元素

假設(shè)p已被定義為指針變量,并已給它賦了一個(gè)地址,使它指向某一個(gè)數(shù)組元素。如果有以下賦值語(yǔ)句:

*p=1;

表示對(duì)p當(dāng)前所指向的數(shù)組元素賦予一個(gè)值(值為1)。圖11.15通過(guò)指針引用數(shù)組元素

【例11-5】使用指針變量來(lái)計(jì)算數(shù)組中所有元素的總和。圖11.16例11-5運(yùn)行結(jié)果11.4.3指向二維數(shù)組的指針變量

1.二維數(shù)組的地址表示

二維數(shù)組的首地址是這片連續(xù)存儲(chǔ)空間的起始地址,它既可以用數(shù)組名表示,也可以用數(shù)組中第一個(gè)元素的地址表示。假設(shè)有如下定義:

inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

2.二維數(shù)組的指針變量

二維數(shù)組指針變量的一般形式如下:

基類型(*指針變量名)[長(zhǎng)度]

【例11-6】輸出二維數(shù)組任一行任一列元素的值。圖11.17例11-6運(yùn)行結(jié)果

11.5字符串與指針

11.5.1用字符數(shù)組表示字符串

將字符串的各個(gè)字符(包括串結(jié)束標(biāo)志?'\0')依次存放到字符數(shù)組中,利用下標(biāo)變量對(duì)數(shù)組進(jìn)行操作。

【例11-7】定義一個(gè)字符數(shù)組,對(duì)它進(jìn)行初始化,然后輸出該字符串。圖11.18例11-7運(yùn)行結(jié)果11.5.2用字符指針表示字符串

對(duì)字符串而言,可以不定義字符數(shù)組,而是直接定義指向字符串的指針變量,利用該指針變量對(duì)字符串進(jìn)行操作。

【例11-8】定義一個(gè)字符型指針變量,并對(duì)它進(jìn)行初始化,然后輸出該字符串。圖11.19例11-8運(yùn)行結(jié)果圖11.20字符指針處理字符串【例11-9】使用字符指針來(lái)確定字符串的長(zhǎng)度。圖11.21例11-9運(yùn)行結(jié)果

11.6指向函數(shù)的指針

與變量一樣,函數(shù)在內(nèi)存中也需要存儲(chǔ)地址。C語(yǔ)言允許定義一個(gè)指向函數(shù)的指針。該指針又可以作為一個(gè)參數(shù)在另一個(gè)函數(shù)中使用。

(1)指向函數(shù)的指針變量的定義:

數(shù)據(jù)類型(*指針變量名)();

這里的數(shù)據(jù)類型是指函數(shù)返回值的類型。

(2)指向函數(shù)的指針變量的賦值:

指針變量名=函數(shù)名;

表示將函數(shù)的入口地址賦給指針變量。

(3)使用指針變量調(diào)用函數(shù):

(*指針變量名)(實(shí)際參數(shù)列表)

使用指向函數(shù)的指針變量調(diào)用函數(shù)時(shí),只需用(*指針變量名)代替函數(shù)名即可。

【例11-10】函數(shù)指針的綜合示例:使用函數(shù)指針作為函數(shù)參數(shù)。圖11.22例11-10運(yùn)行結(jié)果

11.7返回指針值的函數(shù)

一個(gè)函數(shù)可以帶回一個(gè)整型值、字符值、實(shí)型值等,也可以帶回指針型的數(shù)據(jù),即地址。這個(gè)概念與返回整型、字符型、實(shí)型值的函數(shù)概念類似,只是返回的值是指針類型

而已。

返回指針類型數(shù)據(jù)的函數(shù)定義的一般形式如下:

類型名 *函數(shù)名(參數(shù)列表)

【例11-11】返回指針值的函數(shù)。圖11.23例11-11運(yùn)行結(jié)果

11.8指針數(shù)組

11.8.1指針數(shù)組的概念

一個(gè)數(shù)組,其元素均為指針類型的數(shù)據(jù),就稱為指針數(shù)組,也就是說(shuō),指針數(shù)組中的每一個(gè)元素都是一個(gè)指針變量。一維指針數(shù)組定義的形式如下:

類型名*數(shù)組名[數(shù)組長(zhǎng)度]例如:

int*p[4]; /*定義了一個(gè)一維指針數(shù)組p,包含4個(gè)整型指針*/

char*q[5]; /*定義了一個(gè)一維指針數(shù)組q,包含5個(gè)字符型指針*/圖11.24字符串?dāng)?shù)組與指針數(shù)組存儲(chǔ)字符串對(duì)比

【例11-12】將若干個(gè)字符串按字母順序(由小到大)輸出。圖11.25例11-12運(yùn)行結(jié)果11.8.2指針數(shù)組作main函數(shù)的形參

指針數(shù)組的一個(gè)重要應(yīng)用是作為main函數(shù)的形參。在以往的程序中,main函數(shù)的第一行一般寫成以下形式:

main()

括號(hào)中是空的。實(shí)際上,main函數(shù)可以有形參,其參數(shù)形式如下所示:

main(intargc,char*argv[])命令行的一般形式為

命令名參數(shù)1參數(shù)2…參數(shù)n

命令名和各參數(shù)之間用空格分隔。例如,若有一目標(biāo)文件名為file1,要將兩個(gè)字符串“China”,“Beijing”作為傳送給main函數(shù)的參數(shù),可以寫成以下形式:

file1ChinaBeijing圖11.26main函數(shù)的參數(shù)

【例11-13】指針數(shù)組作main函數(shù)的形參。圖11.27例11-13運(yùn)行結(jié)果

11.9鏈表

11.9.1鏈表概述

1.單鏈表結(jié)構(gòu)

鏈表根據(jù)需要開(kāi)辟內(nèi)存單元。圖11.28表示最簡(jiǎn)單的單向鏈表的結(jié)構(gòu)。圖11.28單鏈表結(jié)構(gòu)

2.鏈表中結(jié)點(diǎn)的結(jié)構(gòu)

可以看到,鏈表結(jié)點(diǎn)中要存放下一元素的地址,必須利用指針變量才能實(shí)現(xiàn)。第10章介紹的結(jié)構(gòu)體變量,用它作鏈表中的結(jié)點(diǎn)是最合適的。一個(gè)結(jié)構(gòu)體變量包含若干個(gè)成員,這些成員可以是數(shù)值類型、字符類型、數(shù)組類型,也可以是指針類型。例如,可以設(shè)計(jì)這樣一個(gè)結(jié)構(gòu)體類型:圖11.29單鏈表結(jié)點(diǎn)結(jié)構(gòu)11.9.2處理動(dòng)態(tài)鏈表所需的函數(shù)

鏈表是動(dòng)態(tài)地分配存儲(chǔ)的,即在需要時(shí)才開(kāi)辟一個(gè)結(jié)點(diǎn)的存儲(chǔ)單元,不需要時(shí)釋放結(jié)點(diǎn)空間。怎樣動(dòng)態(tài)地開(kāi)辟和釋放存儲(chǔ)單元呢?C語(yǔ)言編譯系統(tǒng)的庫(kù)函數(shù)提供了以下有關(guān)

函數(shù):

(1)?malloc函數(shù)。其函數(shù)原型為:

void*malloc(unsignedintsize);

(2)?calloc函數(shù)。其函數(shù)原型為:

void*calloc(unsignedn,unsignedsize);

(3)?free函數(shù)。其函數(shù)原型為:

voidfree(void*p);

(4)?realloc函數(shù)。其函數(shù)原型為:

void*realloc(void*ptr,unsignedintsize)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論