




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 教學(xué)內(nèi)容: 11.1 指針的概念 11.2 指針和變量 11.3 指針和數(shù)組 11.4 字符串和指針變量 11.5 函數(shù)和指針 11.6 指針數(shù)組和指向指針變量的指針 第11章 指 針 教學(xué)要求: 1.掌握指針的定義方法和引用方法。 2.掌握指針的運(yùn)算方法。 3.掌握指針與數(shù)組的綜合應(yīng)用程序設(shè)計(jì)方法。 4.掌握指針與字符串處理的程序設(shè)計(jì)方法。 5.了解指針在函數(shù)中的應(yīng)用。第11章 指 針 指針是語言中的重要概念,也是語言的重要特色。 使用指針,可以很好地利用內(nèi)存資源,使其發(fā)揮最大的效率; 使用指針,可以描述復(fù)雜的數(shù)據(jù)結(jié)構(gòu),對字符串的處理可以更靈活,對數(shù)組的處理更方便,使程序的書寫簡潔、高效。
2、 11.1 指針的概念 1.內(nèi)存地址 (1)計(jì)算機(jī)硬件系統(tǒng)的內(nèi)存儲器中,擁有大量的存儲單元,一個字節(jié)為一個存儲單元,容量為字節(jié)。內(nèi)存是按字節(jié)連續(xù)編號的,每一個存儲單元編號就是存儲單元的“地址”。 每個存儲單元都有一個惟一的地址。(2)在地址所標(biāo)識的存儲單元中存放數(shù)據(jù)。注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個完全不同的概念。2.變量地址 系統(tǒng)分配給變量的內(nèi)存單元的起始地址。設(shè)有如下一個程序:main() int n; scanf(%d,&n); printf(n=%dn, n); 變量n地址3000 設(shè)系統(tǒng)分配給變量 n 的2字節(jié)存儲單元為 3000 和3001,則起始地址 3000 就是變
3、量 n 在內(nèi)存中的地址。C編譯程序編譯到該變量定義語句時,將變量n 登錄到“符號表”中。 符號表的關(guān)鍵屬性有兩個: 一是“標(biāo)識符名(id)” , 二是該標(biāo)識符在內(nèi)存空間中的“地址(addr)” 。 3. 指針 指針是一個特殊的變量,它里面存儲的數(shù)值被解釋成為內(nèi)存里的一個地址。 要搞清一個指針需要搞清指針的三個方面的內(nèi)容: (1)指針的類型 (2)指針變量 (3)指針的值或者叫指針?biāo)赶虻膬?nèi)存區(qū)。 4. 指針的類型 指針也是有類型的,它的類型就是它所指向的對象(如變量、數(shù)組、函數(shù)等)的類型,一般在定義指針時指定其類型。 5. 指針的值 指針的值,或者叫指針?biāo)赶虻膬?nèi)存區(qū)或地址。 指針的值是指針本
4、身存儲的數(shù)值,這個值將被編譯器當(dāng)作一個地址,而不是一個一般的數(shù)值。6.存取變量值的方式 (1)直接訪問直接利用變量的地址進(jìn)行存取 1) scanf(“%d”,&n)的執(zhí)行過程是這樣的: 用變量名n作為索引值,檢索符號表,找到變量n的起始地址;然后將鍵盤輸入的值送到內(nèi)存單元中。 2)printf(n=%dn,n)的執(zhí)行過程: 首先找到變量n的起始地址 ,然后從內(nèi)存單元中取出其值,最后將它輸出。 (2)間接訪問通過另一變量訪問該變量的值 語言規(guī)定:在程序中可以定義一種特殊的變量(稱為指針變量),用來存放其它變量的地址。 11.2 指針和變量 1.變量的指針 變量的指針指的是變量的地址,變量的地址指
5、的是給變量分配的存儲單元的首地址。 一個變量定義后,在編譯時系統(tǒng)給變量分配存儲單元。 通過變量的指針能夠找到該變量。 2. 指針變量 專門用于存儲其它變量地址的變量。 3. 指針與指針變量的區(qū)別 指針變量是變量,而指針是地址值。變量的地址可以用取地址符號“&”取變量的地址。 4.指針變量的定義 在使用指針變量之前必須先定義。 定義指針變量格式為: 基類型 *指針變量名 指針變量存儲的是地址 (1)其中“基類型”為指針變量要指向的對象的類型; (2) 變量名前的“ * ”,表示該變量為指針變量。 (3) “指針變量名” 可以自定,但要遵循標(biāo)識符的命名規(guī)則。 5. 指針變量的引用 (1)指針變量只
6、能存放地址,不能將整型數(shù)據(jù)、字符型數(shù)據(jù)、實(shí)型數(shù)據(jù)等非地址類型的數(shù)據(jù)賦值給指針變量。 (2)指針變量只能指向同一類型的變量。 int a=8 ;char h=A; int *p1; char *p2; p1=&a; p2=&h; p1是指向整型變量的指針變量,p2是指向字符型變量的指針變量 *p1和 *p2是p1和p2所指向的變量 a 和h 的值。 p1不能指向字符變量h。int a ,*p ; p =&a; *p=5; (1) &a 表示取a變量的地址。 *p則表示指針變量p所指的對象a 。 &a5pa*p*&a&*p6. 相關(guān)的運(yùn)算符 取地址運(yùn)算符: & 指針運(yùn)算符(或間接訪問運(yùn)算符): *
7、 (2) , &為同級運(yùn)算符,結(jié)合性從右至左。 當(dāng)執(zhí)行了 p&a; 后,則下列表示是等價的: 對象:a= =*p=*&a =*(&a) 指針:p= =&a= =&*p = =&(*p) (3)&*p 等價于&a &*p 即 &(*p1)與 &a等價。 (4) p1=&*p; 的作用是 p1=&a; (5)(*p )+ 等價于a+。 (6) &與*互為逆運(yùn)算,當(dāng)與&連續(xù)在一起時,具有抵消作用: *&a= =a , &*p= =p .7、指針變量的賦值運(yùn)算用取地址運(yùn)算符(&) 將一個變量的地址賦給一個指針變量。 int i, p ; i=3; p=&i; 將一個指針變量賦給另一個同類型的指針變量。
8、int i , pi , pj ;pi=&i ;pj=pi ;作用是使 pi , pj 都指向變量 i。 pii pj&i&i 給指針變量(pi)賦“空”值:a. pi=NULL;b. pi=0c. pi=0 在定義一個變量時,將變量的指針(即地址) 直接賦給指針變量:int x, p=&x; 8. 指針變量的運(yùn)算 指針變量可以進(jìn)行加法或減法運(yùn)算,運(yùn)算時將指針變量里存放的地址加上或減去它指向變量存儲單元的大小。在Turbo C系統(tǒng)中,int為2字節(jié),float為4字節(jié),char為1字節(jié) 。 9. 指針變量作為函數(shù)參數(shù) 指針變量既可以作為函數(shù)的形參,也可以作函數(shù)的實(shí)參。 指針變量作實(shí)參時,將指針
9、變量的值(一個地址)傳遞給被調(diào)用函數(shù)的形參,形參必須是一個指針變量。 例11.1 指針與變量的關(guān)系 #include void main() int x=10, *p;float y=234.5, *pf; p=&x; pf=&y;printf( p=%lu,pf=%lun“ , p, pf);*p=*p+10; *pf=*pf+123.4; printf(-n); printf( x=%d,y=%fn, x, y); printf( x=%d,y=%fn, *p, *pf); 例11.2有問題的程序。指針變量在未賦值前指向一個不定值#include main() int *p, *s, a;
10、 a=*p+*s; printf(a=%dn*p=%lun,a,p); printf(*s=%lu,s); p, s 沒有指向?qū)ο罄?1.3 4 6main( )int *p1,*p2,*p,a,b; scanf(“%d,%d”,&a,&b); p1=&a; p2=&b; if (ab) p=p1; p1=p2; p2=p; printf(“a=%d,b=%dn”,a,b); printf(“max=%d,”,*p1); printf(“min=%dn”,*p2);。 注意:此例中a和b并未交換,而p1和p2的值改變 運(yùn)行情況: 5,9a=5,b=9max=9,min=5 11.3 指 針 和
11、 數(shù) 組 1.數(shù)組中地址的概念 數(shù)組的地址,是指數(shù)組的首地址,即編譯時給數(shù)組分配的一段存儲空間的起始地址。 數(shù)組名代表數(shù)組起始地址,是一個常量。 數(shù)組中每個數(shù)組元素也是占有一定存儲空間的,即每一個數(shù)組元素也有地址。 &a0 2. 指向一維數(shù)組的指針變量 int a10 20002018200212348678910a0a1a2a3a4a5a6a7a8a9p &a0p+1a+1p+9a+9a 指向一維數(shù)組的指針變量定義,與指向普通變量的指針變量的定義方法一樣。 例如: int a10, *p; pa; *p *(p+1) 指向數(shù)組的指針,即存放數(shù)組的首地址的指針變量。指向數(shù)組元素的指針,存放數(shù)組
12、元素地址的指針變量。 (1)可以在定義指針變量的時候給指針變量賦值。 例如: int *p=a; /*將數(shù)組a的首地址賦值給指針變量p*/相當(dāng)于語句: int *p ; p=a ; (2)C語言中數(shù)組名表示的都是數(shù)組的首地址,是一個地址常量。下面的賦值是錯誤的: a = a1 ;3.指針變量的算術(shù)運(yùn)算 (1) p為指針變量 、整數(shù)n:p=p+n 表示p向高地址方向移動n個變量所占空間。 p=pn 表示p向低地址方向移動n個變量所占空間(2) p 為指針變量 p+ 先引用p的值,再向高地址方向移動1個變量的空間。 +p 先向高地址方向移動1個變量的空間,再引用pP - 先引用p的值,再向低地址方
13、向移動1個變量的空間。 -p 先向低地址方向移動1個變量的空間,再引用p(3)a 是地址常量,不能象指針變量那樣上下移動4. 通過指針引用數(shù)組元素數(shù)組元素的引用,既可用下標(biāo)法,也可用指針法。使用下標(biāo)法,直觀;而使用指針法,能使目標(biāo)程序占用內(nèi)存少、運(yùn)行速度快。數(shù)組元素的指針,數(shù)組元素在內(nèi)存中的地址&a3 。 int a10, *p=a; 則:(1)p+i 和a+i 都是數(shù)組元素 ai 的地址&ai (2)*(p+i) 和 *(a+i) 就是數(shù)組元素 ai(3)指向數(shù)組的指針變量,也可將其看作是數(shù)組名,因而可按下標(biāo)法來使用。 例如,pi 等價于 ai 等價于 *(p+i)。 (4)*p 表示取得當(dāng)
14、前所指元素之值。 (5)p+ (或p+=1) 表示p指向下一個元素;而不是簡單地使指針變量p的值+1。其地址值為: p(地址)+1*size (size為一個元素占用字節(jié)數(shù)) 例如,設(shè)指針變量p的當(dāng)前值為3000, 則 p+1的值為 3000+1*2=3002 而不是3001。 (6) *p+ 等價于*(p+),相當(dāng)于ai+。*p p+ 先按 p 的原值進(jìn)行 * 運(yùn)算,即 *p ,得到a0的值, 然后使p的值改變p+1p ,指向下一個數(shù)組元素a 1。 (7) *p 等價于*(p ), 先*p,再p1p地址描述含 義數(shù)組元素的描述含 義a、&a0、pa的首地址*a、a0、*p數(shù)組元素a0的值a+
15、1、p+1、&a1a1的地址*(a+1)、*(p+1)、a1數(shù)組元素a1的值a+i、 p+i、&a0+i 、&aiai的地址*(a+i)、*( p+i)、ai數(shù)組元素ai 的值(8) *(+p) 相當(dāng)于a+i,表示p+1p,再*p。(9) *( p) 相當(dāng)于a i,表示p1p,再*p。(10)(*p)+ 表示p所指之元素的值加1,即ai+1。 指針變量p 與 一維數(shù)組a 的關(guān)系例11.4 采用數(shù)組名地址表示方式,輸入輸出數(shù)組各元素。main( ) int i,a10;for(i = 0;i = 9;i +)scanf(%d, a+i);for(i = 0; i=9; i+)printf(%d,
16、 *(a+i);程序運(yùn)行情況: 1 2 3 4 5 6 7 8 9 01 2 3 4 5 6 7 8 9 0 例11.5 采用指針變量表示方式,輸入輸出數(shù)組各元素。main( ) int i,a10;int *ptr=a; / *定義時對指針變量初始化* /for(i = 0; i=9; i+) scanf(%d, ptr + i);for(i=0; i=9;i+) printf(%d, *(ptr+i);程序運(yùn)行情況: 1 2 3 4 5 6 7 8 9 01 2 3 4 5 6 7 8 9 0例11.6 用指針表示的下標(biāo)法表示方式,輸入輸出數(shù)組各元素。main( ) int i,a10;i
17、nt *ptr=a;for(i = 0; i=9; i+)scanf(%d, &ptri);for(i = 0; i=9; i+)printf(%d, ptri);程序運(yùn)行情況: 1 2 3 4 5 6 7 8 9 01 2 3 4 5 6 7 8 9 0 例11.7 分析下列程序執(zhí)行結(jié)果main( ) int a5=11, 22, 33, 44, 55, *p;p=&a0;printf(*p+=%dn, *p+);printf(*p=%dn, *p);printf(*p)+=%dn, (*p)+);printf(*p=%dn, *p);運(yùn)行結(jié)果: *p+=11 *p=22 (*p)+=22
18、*p=2320002001a020022003a120042005a220062007a320082009a41122334455pP+23 (1)使用指針變量必須注意其當(dāng)前值。 (2)指向數(shù)組的指針變量,可以指向數(shù)組以后的內(nèi)存單元,但沒有實(shí)際意義。 (3)對指向同一數(shù)組的兩個指針變量(px、py)進(jìn)行算術(shù)運(yùn)算和關(guān)系運(yùn)算的含義: px-py:得到兩指針之間的數(shù)組元素個數(shù),而不是指針的地址之差。 px、py的關(guān)系運(yùn)算,表示兩個指針?biāo)傅刂分g、位置的前后關(guān)系:前者為小,后者為大。如果指針px所指地址在指針py所指地址之前,則 pxpy 的值為 1。121234567891011第1行第2行第3行
19、a0:a1:a2:200020082016a+1aa+2 int a34; 設(shè)首地址a為2000 則 a+1 為 2008 a+2 為 2016 (1)數(shù)組名 a 代表數(shù)組的起始地址, 是一個以行為單位進(jìn)行控制的2維數(shù)組的行指針(地址)。 a 是地址常量,不能象指針變量那樣上下移動。 (2)二維數(shù)組名a指向行, a+i 行指針值,指向2維數(shù)組的第i行。 其中, i 代表第 i行一行中全部元素所占的字節(jié)數(shù)。5. 指向二維數(shù)組的指針變量a0a0+1a1a2數(shù)組名a0數(shù)組名a1數(shù)組名a2a0+2a0+3a1+1a1+2a1+3a2+1a2+2a2+3a+2a+1200020082016a123456
20、789101112a (3)行指針是一個級指針。 *(a+i):(列)指針值,指向第i行第列 *(*(a+i): *(*(a+i)+0) 數(shù)組元素ai0的值。 訪問數(shù)組元素aij的格式:*(*(a+i)j) (4)ai (即 ai0)是第 i 行一維數(shù)組的地址,它指向該行的第 0列元素,以數(shù)組元素為單位進(jìn)行控制的列指針。 (5) ai+j:(列)指針值,指向數(shù)組元素aij。 其中的“j”代表j個元素所占的字節(jié)數(shù)。 (6) *(ai+j) 數(shù)組元素aij的值。 6. 指向二維數(shù)組指針變量定義格式 數(shù)據(jù)類型 ( *指針變量 ) ; 例如: int a34, *p; p =a; (p =a0;或p
21、= &a00;)121234567891011 p是指向2維數(shù)組a的指針變量 p+1 指向下一個元素。 p指針訪問數(shù)組元素 aij 格式:*(p+( i*每行列數(shù)+j) )a&app+1 p - - - - - - a0 - - - - - - - - &a00 - - - *a *p - - - - - *a0 - - - - - - - a00 - - - *(*a +0) p+1 - - - - a0+1 - - - - - - &a01 - - *a+1 *(p+1) - - - *(a0+1) - - - - a01 - - - *(*a+1) p+i*4+j - - a0+i*4+
22、j - - - &aij - - - *(a+i)+j *(p+i*4+j) - *(a0+i*4+j) - - aij - - - - *(*(a+i)+j)7.通過指針引用數(shù)組元素表 示 形 式在一維數(shù)組中的含義在二維數(shù)組中的含義a數(shù)組的首地址數(shù)組的首地址 a+i &ai第i個元素的首地址第 i 行首地址*(a+i) ai第i個元素的值第 i 行第 0 列首地址 *(a+i)+j ai+j &aij第 i 行第 j 列首地址 *(*(a+i)+j) *(ai+j) aij第 i 行第 j 列元素的值 數(shù)組元素的地址與值的各種表示形式: 8. 行指針變量 指向由n個元素組成的一維數(shù)組的指針變
23、量 (1)定義格式 數(shù)據(jù)類型 ( *指針變量 )n; 注意:“*指針變量” 外的括號不能缺, 例如: int a34, (*p) n; p =a; (或p =a0;)121234567891011 p+1 指向下一行。 p指針訪問數(shù)組元素 aij 格式: *(*( p+ i) +j)a&apP+1例11.8 用指向數(shù)組的指針變量輸入輸出二維數(shù)組各元素。main( ) int a34,*ptr; int i,j; ptr = a0; /*給指針變量賦值為&a00*/ for(i = 0; i3; i+) for(j = 0; j 4; j+) scanf(%d, ptr+); / *指針的表示方
24、法* / ptr = a0; for(i = 0; i3; i+) for(j = 0; j4; j+) printf(%d, *ptr+); printf(/n);程序運(yùn)行情況:1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12例 11.9使用列指針輸出2維數(shù)組的任一元素。main() int ay34=1,2,3,4,5,6,7,8,9,10,11,12; int *pa, row, col; /*定義列指針變量pa*/ pa=ay0; /*給指針變量pa賦值*/ printf(“Input row = ”); scanf(“%d”,
25、&row); printf(“Input col = ”); scanf(“%d”,&col); printf(“ay%1d%1d=”,row,col); printf( “%dn”*(pa+(row*4+col) ); 例 11.10 使用行指針輸出2維數(shù)組的任一元素。 main() int ay34=1,2,3,4,5,6,7,8,9,10,11,12; int (*pa)4, row, col; pa=ay; printf(“In row = ”); scanf(“%d”, &row); printf(“In col=”);scanf(“%d”,&col); printf(“ay%1d%
26、1d=”,row, col); prinf(“%dn”, *(*(pa+row)+col); 程序運(yùn)行情況: In row = 1 In col = 2 ay12 = 711.4 字符串和指針變量 1. 字符串的指針 : 字符串在內(nèi)存中的起始地址。 在語言中,也可以用字符數(shù)組表示字符串,也可以定義一個字符指針變量指向一個字符串。 引用時,既可以逐個字符引用,也可以整體引用。2.指向字符串的指針變量定義格式 : char *指針變量 ; 3.定義并初始化字符指針變量: 例如: char *stg=I love Beijing.; 等價于: char *stg; stg=I love Beijin
27、g. ; 用字符串常量“I love Beijing.”的地址(由系統(tǒng)自動開辟、存儲串常量的內(nèi)存塊的首地址)給stg賦初值。4.字符串的字符逐個引用例 11.11使用字符指針變量表示和引用字符串。main() char *stg for ( ; *stg!=0; stg+) printf(“%c”, *stg); printf(“n”); 注意:字符指針變量stg,僅存儲串常量的地址,而串常量的內(nèi)容(即字符串本身),是存儲在由系統(tǒng)自動開辟的內(nèi)存塊中,并在串尾添加一個結(jié)束標(biāo)志0。程序運(yùn)行結(jié)果: I love Beijing.5.字符串的整體引用例 11.12 改寫例 11.11 ,采取整體引用的
28、辦法 。 main() char *stg=”I love Beijing.”; printf(“%sn”,stg); printf(“%sn”,stg); 語句 執(zhí)行說明:系統(tǒng)首先輸出stg指向的第1個字符,然后使stg自動加,使之指向下一個字符,輸出stg指向的第2個字符;重復(fù)上述過程,直至遇到字符串結(jié)束標(biāo)志。注意: 其它類型的數(shù)組,是不能用數(shù)組名來一次性輸出它的全部元素的,只能逐個元素輸出。例如: int ay10=; printf(%dn,ay); /*非法用法*6.字符指針變量與字符數(shù)組之比較(1) 字符數(shù)組由若干個元素組成,每個元素可存放1個字符;字符指針變量存放的是字符串的首地址
29、,絕不是將字符串存放到字符指針變量中。 (2) 對字符指針變量賦初值時: char *a=“I love China!”; 等價于:char *a; a=“I love China!”;這里賦給a 的是字符串的首地址,而不是字符串。 對數(shù)組初始化時: static char str14=“I love China!”; 不能作如下的數(shù)組賦初值操作: char str14; str =“I love China!”; 即數(shù)組可以在變量定義時整體賦初值,但不能在賦值語句中整體賦值,字符數(shù)組只能對各個元素賦值。 (3) 數(shù)組在編譯時被分配內(nèi)存單元,有確定的地址。寫成如下形式是可以的。如: char
30、str14;scanf(“%s”,str); 指針變量必須賦給一個確定的地址值,否則,在程序運(yùn)行時會發(fā)生意想不到的后果。指針變量沒有確定的地址而指向程序區(qū)或其它數(shù)據(jù)區(qū),從而會造成系統(tǒng)“沖突”。 例如:char *a; scanf(“%s”,a); 是非常危險的。 應(yīng)當(dāng)寫成如下形式:char *a, str10;a=str;scanf(“%s”,a); (4) 指針變量的地址值是可以改變的,而數(shù)組名的地址值是不能改變的。如: main( ) char *a=“I love China!”; a=a+7; printf(“%s”,a); 運(yùn)行結(jié)果如下: China! 下面的寫法是錯誤的:char
31、str =“I love China!”;str=str +7;printf(“%s”,str); (5) 若定義一個指針變量使它指向一個字符串后,可以用下標(biāo)形式引用指針變量所指字符串中的字符。 例11.13字符指針變量的使用 main( ) char *p=“I love China.”; int i=5; printf( “%cn”,pi ); for ( i=7; pi!=0; i+ ) printf(“%c”,pi); 運(yùn)行結(jié)果如下: e China. (6) 可以用指針變量指向一個格式字符串來代替printf函數(shù)中的格式字符串。也可以在定義字符數(shù)組賦初值時賦予一個格式字符串代替pri
32、ntf函數(shù)中的格式字符串。如:char *format;format=“a=%d, b=%f n”;printf(format, a, b);它相當(dāng)于:printf(“a=%d, b=%f n”, a, b); 例11.14 用指向字符串的指針變量處理兩個字符串的復(fù)制。字符串的復(fù)制要注意的是:若將串1復(fù)制到串2,一定要保證串2的長度大于或等于串1的長度。#includemain( ) char str130, str220; char *ptr1=str1, *ptr2=str2; gets(str2); /* 輸入str2*/ while(*ptr2!=”0”) *ptr1+=*ptr2+;
33、 / *字符串復(fù)制* / printf(%s.%sn, str1, str2); 例11.15求字符串的長度,用指針變量作函數(shù)參數(shù) #include int getlength(char *str) char *p=str; while(*p!=0) p+; return p-str; main() char *string=I am a student; printf(The length of %s, string); printf( is %d “ , getlength(string) ); 例11.16字符串的復(fù)制,實(shí)參、形參都是字符指針變量 void scopy( char *fr
34、om , char *to ) for ( ; *from != 0; from+; to+) *to = *from ; *to = 0; main( ) char *a= “I am a teacher.”; char *b= “you are a student.”; scopy( a, b ); printf( “string_a = %snstring_b = %sn”,a,b) ; 先判斷后復(fù)制 例11.17字符串的復(fù)制,數(shù)組名作實(shí)參,形參指針變量。void scopy(char *sfrom, char *sto) int i=0; for( ; (*(sto+i )=*(sfr
35、om+i )!=0; i+) ; main() char astr120=”I am a teacher.”; char astr220; scopy(astr1, astr2); printf(“astr2=%sn”, astr2); 先復(fù)制、后判斷11.5 函 數(shù) 和 指 針1.函數(shù)指針的概念 一個函數(shù)在編譯時,被分配了一個入口地址,這個地址就稱為該函數(shù)的指針??梢杂靡粋€指針變量指向一個函數(shù),然后通過該指針變量調(diào)用此函數(shù)。 2.指向函數(shù)的指針變量 (1)定義格式 函數(shù)類型 (*指針變量) ( ); 注意:“*指針變量”外的括號不能缺,否則成了返回指針值的函數(shù)。例如,int (*fp) (
36、); /* fp為指向int函數(shù)的指針變量*/(2)可用函數(shù)名給指向函數(shù)的指針變量賦值: 指向函數(shù)的指針變量 = 函數(shù)名; 函數(shù)名代表該函數(shù)的入口地址。注意:函數(shù)名后不能帶括號和參數(shù);函數(shù)名前的“&”符號是可選的。 (3)調(diào)用指向的函數(shù)格式 (*函數(shù)指針變量) (實(shí)參表) (4)對指向函數(shù)的指針變量,諸如p+i、p+/p-等運(yùn)算是沒有意義的。 用指針變量調(diào)用一個函數(shù)的過程,有以下3個步驟:(1)定義一個指向函數(shù)的指針變量。(2)將一個函數(shù)名(函數(shù)入口地址)賦值給指針變量, (3)用指針變量實(shí)現(xiàn)函數(shù)的調(diào)用。例11.18通過指針變量實(shí)現(xiàn)函數(shù)調(diào)用,計(jì)算1+2+3.+n 。 Long int sum(
37、int m) int i; Long int t=0; for(i = 1; i =m;i+) t=t+i; return t; main( ) int n; long int s; long int(*p)( );/*定義指向函數(shù)的指針變量*/ scanf(”%d”,&n); 5 p=sum; /*指針指向函數(shù)*/ s=(*p)(n);/*通過指針變量調(diào)用函數(shù)*/ printf(sum = %dn,s); 3.指向函數(shù)的指針變量作函數(shù)參數(shù) 指向函數(shù)的指針變量(函數(shù)指針)作參數(shù),其作用是:在函數(shù)的執(zhí)行過程中,可以根據(jù)實(shí)參的函數(shù)名來調(diào)用不同的函數(shù)。 函數(shù)名作實(shí)參時,必須加以說明。 例11.19
38、函數(shù)指針做為函數(shù)的參數(shù) #include int max(int a,int b) return ab?a:b; int min(int a,int b) return ab?a:b; int getvalue(int (*p)(),int a,int b) return (*p)(a,b); main() printf(The max of 3 and 4 is ); printf(%dn,getvalue(max,3,4); printf(The min of 3 and 4 is ); printf(%d,getvalue(min,3,4); 4. 返回指針值的函數(shù) 返回指針值的函數(shù)也稱
39、為指針函數(shù)。調(diào)用指針函數(shù)后能得到一個指向指定類型數(shù)據(jù)的指針(地址)。 指針函數(shù)的定義形式如下: 類型標(biāo)識符 *函數(shù)名(參數(shù)表) 例如: int *fa( int x, int y ) 定義了一個指針函數(shù) fa() 。x ,y 為函數(shù) fa()的形參。 5.指針函數(shù)與指向函數(shù)的指針變量之間的區(qū)別: int *a(x,y) 定義a為整型指針函數(shù)。 int (*a)( ); 定義a為指向函數(shù)的指針變量。 例11.20 返回指針值的函數(shù)應(yīng)用。 long int *sum(int m) int i; Long int *p, t=0; for(i = 1; i =m;i+) t=t+i; p=&t;/*
40、p指向變量t*/ return p; main( ) int n;long int *q; scanf(”%d”,&n); q=sum(n);/*通過指針獲取返回的地址值*/printf(sum = %dn,*q); 11.6 指針數(shù)組和指向指針變量的指針 1 . 指針數(shù)組概念數(shù)組的每個元素都是一個指針數(shù)據(jù)的數(shù)組。指針數(shù)組比較適合用于指向多個字符串,使字符串處理更加方便、靈活。 2.指針數(shù)組定義格式 數(shù)據(jù)類型 *數(shù)組名元素個數(shù) 例: int *an5; float *fb4;注意與行指針變量定義格式的差別: int (*an)5; float (*fb)4; 例11.21 有5本圖書,請按字母
41、從小到大順序輸出書名。 解題要求: 指針數(shù)組名作實(shí)參,調(diào)用排序函數(shù)sort() 完成排序, 在主函數(shù)中進(jìn)行輸入輸出。 程序中實(shí)參對形參的值傳遞: sort ( name , 5 ); void sort(char *name, int count) 程序如下: main() void sort( char *name, int count ) ; char *name5=“BASIC”,”FORTRAN”, ”PASCAL”,”C”,”FoxBASE”; int i=0; sort ( name, 5); for(; i5; i+) printf(“%sn”,namei); 程序運(yùn)行結(jié)果: BASIC C FORTRAN FoxBASE PASCALvoid sort( char *name, int count ) char *p; int i, ,j, min; /*使用選擇法排序*/ for(i=0; icount-1; i+)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年法律知識競賽搶答題庫及答案(共80題)
- 泰坦尼克號:初中英語教學(xué)詞匯教案
- 駱駝祥子人物性格分析教學(xué)教案:探究社會變遷與人性的掙扎
- 汽車租賃三方合同
- 農(nóng)作物種植技術(shù)手冊
- 圖表展示各類數(shù)據(jù)統(tǒng)計(jì)情況
- 小學(xué)生數(shù)學(xué)應(yīng)用題的作文分析與實(shí)踐指導(dǎo)
- 留置擔(dān)保合同協(xié)議書
- 文學(xué)佳作圍城中的人物形象解讀
- 智能交通大數(shù)據(jù)平臺開發(fā)協(xié)議
- 【課件】2.1.1植物細(xì)胞工程的基本技術(shù)課件-2021-2022學(xué)年高二下學(xué)期生物人教版選擇性必修3
- 35kV集電線路直埋施工組織設(shè)計(jì)方案
- 客戶來訪登記表
- 日產(chǎn)新軒逸電子手冊cvt
- 人教八年級下冊英語U5Do-you-remember-what-you-were-doing?課件
- 小學(xué)人教版四年級下冊數(shù)學(xué)租船問題25題
- 大連市小升初手冊
- 醫(yī)療垃圾管理及手衛(wèi)生培訓(xùn)PPT課件
- 嚇數(shù)基礎(chǔ)知識共20
- 鋰電池安全知識培訓(xùn)-課件
- 電子產(chǎn)品高可靠性裝聯(lián)工藝下
評論
0/150
提交評論