![第七章指針-1_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/ea5167f1-0d09-4893-a461-35ea6f15de8a/ea5167f1-0d09-4893-a461-35ea6f15de8a1.gif)
![第七章指針-1_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/ea5167f1-0d09-4893-a461-35ea6f15de8a/ea5167f1-0d09-4893-a461-35ea6f15de8a2.gif)
![第七章指針-1_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/ea5167f1-0d09-4893-a461-35ea6f15de8a/ea5167f1-0d09-4893-a461-35ea6f15de8a3.gif)
![第七章指針-1_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/ea5167f1-0d09-4893-a461-35ea6f15de8a/ea5167f1-0d09-4893-a461-35ea6f15de8a4.gif)
![第七章指針-1_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/ea5167f1-0d09-4893-a461-35ea6f15de8a/ea5167f1-0d09-4893-a461-35ea6f15de8a5.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1第七章第七章 指針指針7.1 7.1 指針與地址指針與地址7.2 7.2 指針變量的定義與使用指針變量的定義與使用7.3 7.3 指針與數(shù)組指針與數(shù)組. .7.4 7.4 指針數(shù)組指針數(shù)組7.5 7.5 多維數(shù)組作為參數(shù)的通用函數(shù)多維數(shù)組作為參數(shù)的通用函數(shù)7.6 7.6 動(dòng)態(tài)存儲(chǔ)管理動(dòng)態(tài)存儲(chǔ)管理7.7 7.7 定義類(lèi)型定義類(lèi)型7.8 7.8 指向函數(shù)的指針指向函數(shù)的指針21. 幾個(gè)概念幾個(gè)概念程序執(zhí)行過(guò)程中數(shù)據(jù)存于內(nèi)存程序執(zhí)行過(guò)程中數(shù)據(jù)存于內(nèi)存。在可用期間數(shù)據(jù)有確定存儲(chǔ)位置,占據(jù)一些存儲(chǔ)單在可用期間數(shù)據(jù)有確定存儲(chǔ)位置,占據(jù)一些存儲(chǔ)單元。元。內(nèi)存單元的編號(hào):內(nèi)存單元的編號(hào):地址地址機(jī)器語(yǔ)言通過(guò)
2、地址訪(fǎng)問(wèn)數(shù)據(jù)。高級(jí)語(yǔ)言用變量等作機(jī)器語(yǔ)言通過(guò)地址訪(fǎng)問(wèn)數(shù)據(jù)。高級(jí)語(yǔ)言用變量等作為存儲(chǔ)單元為存儲(chǔ)單元/地址的抽象。地址的抽象。建立變量就是安排存儲(chǔ)。賦值時(shí)存入,用值時(shí)從中建立變量就是安排存儲(chǔ)。賦值時(shí)存入,用值時(shí)從中提取提取7.1 地址與指針地址與指針3指針是一種訪(fǎng)問(wèn)對(duì)象的手段指針是一種訪(fǎng)問(wèn)對(duì)象的手段2.訪(fǎng)問(wèn)對(duì)象訪(fǎng)問(wèn)對(duì)象(變量變量)的方式的方式:n通過(guò)變量名通過(guò)變量名: int a; a=3;n通過(guò)變量的地址通過(guò)變量的地址: 地址也被作為地址也被作為數(shù)據(jù),數(shù)據(jù),地址值地址值/指針值指針值。以地址為值的變量稱(chēng)為以地址為值的變量稱(chēng)為指針變量指針變量/指針指針(pointer)。int *p,a; p=&
3、amp;a;*p=3;4 指針賦值:將對(duì)象的地址存入指針變量。指針賦值:將對(duì)象的地址存入指針變量。 間接訪(fǎng)問(wèn):通過(guò)指針訪(fǎng)問(wèn)被指對(duì)象。間接訪(fǎng)問(wèn):通過(guò)指針訪(fǎng)問(wèn)被指對(duì)象。指針指針p保存著變量保存著變量x地址,也說(shuō)地址,也說(shuō)指針指針p指向指向x。指針變量 p變量 x圖 7.1指針與被指的變量3.指針的主要操作指針的主要操作指針是變量,可賦值,其指向可以改變。指針是變量,可賦值,其指向可以改變。5在在C中使用指針常能寫(xiě)出中使用指針常能寫(xiě)出更簡(jiǎn)潔有效更簡(jiǎn)潔有效的程序。有的程序。有些問(wèn)題必須用指針處理。些問(wèn)題必須用指針處理。指針在大型復(fù)雜軟件中使用廣泛。指針在大型復(fù)雜軟件中使用廣泛。指針使用的水指針使用的水
4、平是評(píng)價(jià)人的平是評(píng)價(jià)人的C程序設(shè)計(jì)能力的重要方面。程序設(shè)計(jì)能力的重要方面。C指針靈活指針靈活/功能強(qiáng)功能強(qiáng)。掌握有難度,易用錯(cuò),應(yīng)特。掌握有難度,易用錯(cuò),應(yīng)特別注意。應(yīng)特別注意使用指針的常見(jiàn)錯(cuò)誤,別注意。應(yīng)特別注意使用指針的常見(jiàn)錯(cuò)誤,注意!注意!67.2 指針變量的定義和使用指針變量的定義和使用l指針有類(lèi)型,通常只能保存特定類(lèi)型變量的地址;指針有類(lèi)型,通常只能保存特定類(lèi)型變量的地址;l定義指針需指明定義指針需指明指向類(lèi)型指向類(lèi)型。 定義指向定義指向int的的指針變量指針變量:int *p, *q; 指針變量可以與其他變量一起定義指針變量可以與其他變量一起定義:double *p, n, a10
5、, *q, *p1, m;l指針是指針是變量變量,可賦值取值,有定義域與存在期。,可賦值取值,有定義域與存在期。1.指針變量的定義指針變量的定義:數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 *指針變量名指針變量名;7取地址運(yùn)算符取地址運(yùn)算符& 和間接訪(fǎng)問(wèn)操作和間接訪(fǎng)問(wèn)操作 * 一元運(yùn)算符一元運(yùn)算符指針變量 p變量 n圖 7.2兩個(gè)指針指向同一個(gè)變量的情況指針變量 ql取地址運(yùn)算取地址運(yùn)算: & 寫(xiě)在寫(xiě)在變量名前取變量地址,是對(duì)應(yīng)類(lèi)型的指針變量名前取變量地址,是對(duì)應(yīng)類(lèi)型的指針值,可賦給類(lèi)型合適的指針變量。值,可賦給類(lèi)型合適的指針變量。 int n,*p,*q,*p1,a10=;n=3;p = &n
6、; q = p; p1 = &a1;2.指針操作指針操作此時(shí)此時(shí),p,q指向同一個(gè)變量指向同一個(gè)變量8l間接運(yùn)算間接運(yùn)算 *寫(xiě)在指針變量前用來(lái)取指針?biāo)缸兞康闹祵?xiě)在指針變量前用來(lái)取指針?biāo)缸兞康闹? 這種表達(dá)式可以像普通變量一樣使用。這種表達(dá)式可以像普通變量一樣使用。 int n=7,*p; p=&n;*p = 17; q=p; /*相當(dāng)于相當(dāng)于n=17;*/ m = *p + *q * n; /* 寫(xiě)寫(xiě)*p相當(dāng)于直接寫(xiě)相當(dāng)于直接寫(xiě)n。/* 訪(fǎng)問(wèn)訪(fǎng)問(wèn)n三次三次 */+*p; /* 使變量使變量n的值加的值加1,變成,變成18 。*/(*p)+; /* 使變量使變量n的值再加的值
7、再加1,變成,變成19。*/*p += *q + n; /* 變量變量n被賦以新值被賦以新值57 。* /q = &a0;/* 指針指針q指向了數(shù)組指向了數(shù)組a的元素的元素a0 。*/*p+; / /* * 取出變量取出變量n的值的值, ,p指向下一個(gè)地址。指向下一個(gè)地址。* */ /9觀(guān)察執(zhí)行結(jié)果:觀(guān)察執(zhí)行結(jié)果:#includeint main()int *p,n,m,*p1,*p2,n1,m1;p=&n;*p=3;p1=p;p2=p;n=(*p1)+;m=*p2+; n1=*p1;m1=*p2;printf(n=%d m=%dn,n,m);printf(n1=%d m1=%
8、dn,n1,m1);return 0;10假定一個(gè)整型數(shù)據(jù)占兩個(gè)存儲(chǔ)單元。假定一個(gè)整型數(shù)據(jù)占兩個(gè)存儲(chǔ)單元。int i,j,k;int *p=&i; (p=2000)p+; (p=2002)p+; (p=2004)p-; (p=2002)指針變量算術(shù)運(yùn)算的過(guò)程;指針變量算術(shù)運(yùn)算的過(guò)程;p新新 =p原值原值 +n*sizeof(類(lèi)型)類(lèi)型)200020022004地址k kj ji ip=&ip=&i不允許直接對(duì)指針變量賦常量值。不允許直接對(duì)指針變量賦常量值。 如:如:int *point; point=2000; ( )11main() int *p1,*p2,*p,a,
9、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,min=%dn”,*p1,*p2);&a7&b8p2p1&b7&a8p2p1abbap分析下面程序的功能分析下面程序的功能交換指針,怎樣交換內(nèi)容?交換指針,怎樣交換內(nèi)容?12#includeint main() int *p1,*p2,t,a,b; scanf(%d,%d,&a,&b); p1=&a;p2
10、=&b; if(ab) t=*p1;*p1=*p2;*p2=t; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);&a7&b8p2p1&b8&a7p2p1abbap分析下面程序的功能分析下面程序的功能交換內(nèi)容交換內(nèi)容133.指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)有特殊意義指針作為函數(shù)參數(shù)有特殊意義-修改調(diào)用時(shí)環(huán)境的函數(shù)修改調(diào)用時(shí)環(huán)境的函數(shù)一般變量(含數(shù)組元素)作為函數(shù)參數(shù)一般變量(含數(shù)組元素)作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)14void
11、 swap0 (int x, int y) int t = x; x = y; y = t;int main () int a = 5, b = 10; swap0(a, b);是否能完成是否能完成a,b交換?交換?否否例:定義函數(shù)例:定義函數(shù)swap,希望用它交換兩個(gè)變量的值。,希望用它交換兩個(gè)變量的值。問(wèn)題:?jiǎn)栴}:因?yàn)橐淖儍蓚€(gè)變量,無(wú)法通過(guò)返回值解決。因?yàn)橐淖儍蓚€(gè)變量,無(wú)法通過(guò)返回值解決。15 用指針可以解決問(wèn)題用指針可以解決問(wèn)題 類(lèi)似于數(shù)組名作參數(shù)類(lèi)似于數(shù)組名作參數(shù) g 的函數(shù)體 參數(shù) p 指針 指針變量 m 在函數(shù)體里用*p 可以訪(fǎng)問(wèn)和改變實(shí)參變量 m. 圖 7.3 在函數(shù)里通過(guò)指
12、針可以訪(fǎng)問(wèn)外面的變量 把把m的地址的地址(也是值)通過(guò)(也是值)通過(guò)指針參數(shù)指針參數(shù)p傳給函數(shù)傳給函數(shù)g,函數(shù)內(nèi)對(duì),函數(shù)內(nèi)對(duì)p間接訪(fǎng)問(wèn)就能操作間接訪(fǎng)問(wèn)就能操作m,包括對(duì),包括對(duì)m賦值(改變賦值(改變m)。)。16交換數(shù)據(jù)的函數(shù)交換數(shù)據(jù)的函數(shù)swap可定義為:可定義為:void swap(int *p, int *q) int t = *p; *p = *q; *q = t;交換變量交換變量m和和n的值,調(diào)用形式是:的值,調(diào)用形式是: swap(&m, &n);設(shè)有變量定義:設(shè)有變量定義:int a10=,k;調(diào)用調(diào)用swap的實(shí)例:的實(shí)例:swap(&a0,&a
13、5); swap(&a1,&k);17swap參數(shù)類(lèi)型是參數(shù)類(lèi)型是(int *) 實(shí)參實(shí)參必須是必須是合法的整型變量的地址合法的整型變量的地址swap 的函數(shù)體p變量 m圖 7.4函數(shù)調(diào)用 swap(&m, &n)形成的現(xiàn)場(chǎng)變量 nq18利用指針變量作為函數(shù)參數(shù)利用指針變量作為函數(shù)參數(shù)void set3(int *np) *np = 3;int main() int n, m; set3(&n); /* 設(shè)置設(shè)置n和和m ,&n和和&m為實(shí)參為實(shí)參 */ set3(&m); printf(%d, %dn, n, m); retur
14、n 0;請(qǐng)回憶請(qǐng)回憶scanf的情況。的情況。scanf(“%d”,&n);n&n進(jìn)入函數(shù)進(jìn)入函數(shù)np=&n通過(guò)參數(shù)改變調(diào)用環(huán)境的方案通過(guò)參數(shù)改變調(diào)用環(huán)境的方案包括三方面:包括三方面:1. 函數(shù)定義中用函數(shù)定義中用指針參數(shù)指針參數(shù); void set3(int * np) 2. 函數(shù)內(nèi)用函數(shù)內(nèi)用間接操作間接操作實(shí)際變量;實(shí)際變量;*np = 3;3. 調(diào)用時(shí)以被操作調(diào)用時(shí)以被操作變量的地址變量的地址作為實(shí)參。作為實(shí)參。 set3(&n); 19int main() int a,b,*point1,*point2; scanf(%d,%d,&a,&
15、b); point1=&a,point2=&b; if(a p2) .當(dāng)當(dāng)p3所指的元素在所指的元素在p2所指的元素之后時(shí)條件成立所指的元素之后時(shí)條件成立(值為(值為1),否則不成立(值為,否則不成立(值為0)。兩個(gè)指針不指在同一數(shù)組里時(shí),比)。兩個(gè)指針不指在同一數(shù)組里時(shí),比較大小沒(méi)有意義。較大小沒(méi)有意義。如果兩指針指在同一個(gè)數(shù)組里,可以求差,得到它們間的如果兩指針指在同一個(gè)數(shù)組里,可以求差,得到它們間的數(shù)組元素個(gè)數(shù)(帶符號(hào)整數(shù))。數(shù)組元素個(gè)數(shù)(帶符號(hào)整數(shù))。 n = p3 p2;29兩個(gè)兩個(gè)同類(lèi)型指針同類(lèi)型指針可用可用 = 和和 != 比較相等或不等;比較相等或不等;任何指針
16、都能與任何指針都能與通用指針通用指針比較相等或不等;比較相等或不等;任何指針可與任何指針可與空指針空指針值(值(0或或NULL)比較相等或不等)比較相等或不等兩指針指向兩指針指向同一數(shù)據(jù)同一數(shù)據(jù)元素,或同為元素,或同為空值空值時(shí)它們相等時(shí)它們相等。1).數(shù)組寫(xiě)法與指針寫(xiě)法:指針的兩種用法數(shù)組寫(xiě)法與指針寫(xiě)法:指針的兩種用法設(shè)設(shè)p1=&a0,p3= &a5 p1和和p3相當(dāng)于數(shù)組名相當(dāng)于數(shù)組名 可寫(xiě):可寫(xiě):p13 = 5; 相當(dāng)于相當(dāng)于*(p1+3)=5;或;或 a3=5; p32 = 8; 相當(dāng)于相當(dāng)于*(p3+2)=8;或;或 a7=8; p13稱(chēng)為指針的稱(chēng)為指針的數(shù)組寫(xiě)法數(shù)組
17、寫(xiě)法,*(p1+3)稱(chēng)為稱(chēng)為指針寫(xiě)法指針寫(xiě)法兩類(lèi)寫(xiě)法有等價(jià)效力,可以自由選用。兩類(lèi)寫(xiě)法有等價(jià)效力,可以自由選用。int *p1, *p2, *p3, *p4;int a10 = 1,2,3,4,5,6,7,8,9,10; 302).數(shù)組名是數(shù)組首元素的地址數(shù)組名是數(shù)組首元素的地址(值值)n數(shù)組名可以數(shù)組名可以“看作看作”常量指針,可參與一些指針運(yùn)常量指針,可參與一些指針運(yùn)算,算,與其他指針比大小,比較相等與不相等。與其他指針比大小,比較相等與不相等。n通過(guò)數(shù)組名的元素訪(fǎng)問(wèn)也可以采用指針寫(xiě)法。通過(guò)數(shù)組名的元素訪(fǎng)問(wèn)也可以采用指針寫(xiě)法。 a3 可寫(xiě)為可寫(xiě)為 *(a+3)n注意:注意:數(shù)組名不是指針變
18、量數(shù)組名不是指針變量,不能賦值,不能更改。,不能賦值,不能更改。 若若a為數(shù)組,為數(shù)組,下面操作都是錯(cuò)誤的下面操作都是錯(cuò)誤的:a+;a += 3;a = p;313).指針運(yùn)算原理指針運(yùn)算原理一個(gè)指針指向某數(shù)組里的元素時(shí),為什么能算出下一元素一個(gè)指針指向某數(shù)組里的元素時(shí),為什么能算出下一元素位置?(這是指針運(yùn)算的基礎(chǔ))位置?(這是指針運(yùn)算的基礎(chǔ))指針有指針有指向類(lèi)型指向類(lèi)型,p指向數(shù)組指向數(shù)組a時(shí),由于時(shí),由于p的指向類(lèi)型與的指向類(lèi)型與a的的元素類(lèi)型一致,數(shù)據(jù)對(duì)象的大小可以確定。元素類(lèi)型一致,數(shù)據(jù)對(duì)象的大小可以確定。p+1的值可根據(jù)的值可根據(jù)p的值和數(shù)組元素大小算出的值和數(shù)組元素大小算出。由一
19、個(gè)數(shù)組元。由一個(gè)數(shù)組元素位置可以算出下一元素位置,或幾個(gè)元素之后的元素位素位置可以算出下一元素位置,或幾個(gè)元素之后的元素位置。指針運(yùn)算的基礎(chǔ)。置。指針運(yùn)算的基礎(chǔ)。 通用指針即使指到數(shù)組里,因沒(méi)有確定指向類(lèi)型,因此不能做通用指針即使指到數(shù)組里,因沒(méi)有確定指向類(lèi)型,因此不能做一般指針計(jì)算,只能做指針比較。一般指針計(jì)算,只能做指針比較。324).4).基于指針的數(shù)組程序設(shè)計(jì)基于指針的數(shù)組程序設(shè)計(jì)指針運(yùn)算是處理數(shù)組元素的另一方式。設(shè)有指針運(yùn)算是處理數(shù)組元素的另一方式。設(shè)有int數(shù)組數(shù)組a和指和指針針p1,p2,下面代碼都,下面代碼都打印打印a的元素:的元素: for (p1 = a, p2 = a+1
20、0; p1 p2; +p1) printf(%dn, *p1);for (p1 = a; p1 a+10; +p1) printf(%dn, *p1);for (p1 = p2 = a; p1 - p2 10; +p1) printf(%dn, *p1);for (p1 = a; p1 - a 10; +p1) printf(%dn, *p1);int *p1, *p2, *p3, *p4;int a10 = 1,2,3,4,5,6,7,8,9,10; 335).5).數(shù)組參數(shù)的意義數(shù)組參數(shù)的意義C C規(guī)定,數(shù)組參數(shù)規(guī)定,數(shù)組參數(shù)就是就是相應(yīng)的指針參數(shù):相應(yīng)的指針參數(shù):int f(int n,
21、 int d) . .int f(int n, int *d) . . 數(shù)組參數(shù)就是利用指針實(shí)現(xiàn)的!數(shù)組參數(shù)就是利用指針實(shí)現(xiàn)的!這也使采用數(shù)組參數(shù)的函數(shù)能修改實(shí)參數(shù)組。這也使采用數(shù)組參數(shù)的函數(shù)能修改實(shí)參數(shù)組。函數(shù)里也可用指針?lè)绞阶鲈卦L(fǎng)問(wèn)。函數(shù)里也可用指針?lè)绞阶鲈卦L(fǎng)問(wèn)。int funsum (int n, int a) int i, m = 0; for (i = 0; i n; +i) m += *(a+i); return m;m+=ai;意義相同意義相同346).使用數(shù)組的一段元素使用數(shù)組的一段元素以數(shù)組為參數(shù)的函數(shù)可處理一段元素。求元素和:以數(shù)組為參數(shù)的函數(shù)可處理一段元素。求元素和:
22、double sum(int n, double a);設(shè)有雙精度數(shù)組設(shè)有雙精度數(shù)組b,40個(gè)元素已有值:個(gè)元素已有值:用用sum可求可求b所有元素之和所有元素之和/前一段元素之和:前一段元素之和:x = sum(40, b);y = sum(20, b);sum不知道不知道b的大小,它由參數(shù)得到數(shù)組首元素地址,從這的大小,它由參數(shù)得到數(shù)組首元素地址,從這里開(kāi)始求連續(xù)里開(kāi)始求連續(xù)40或或20個(gè)元素的和。個(gè)元素的和。也可用也可用sum求求b中中下標(biāo)下標(biāo)12到到24的一段元素之和。的一段元素之和。 z = sum(13, b+12);35#includeenumN=10;int funsum (i
23、nt n, int a) int i, m = 0; for (i = 0; i n; +i) m += *(a+i); return m;int main() int aN,i,sum; for(i=0;iN;i+) scanf(%d, &ai); sum= funsum(N,a); printf(%dn, sum); return 0;a+i36#includeenumN=10;int funsum (int n, int a) int i, m = 0; for (i = 0; i n; +i) m += *(a+i); return m;int main() int aN,*p
24、,sum; for(p=a;p-aN;p+) scanf(%d, p); sum= funsum(N,a); printf(%dn, sum); return 0;37例輸入例輸入a a、b b、c c三個(gè)整數(shù),按大小順序輸出三個(gè)整數(shù),按大小順序輸出。main() int a,b,c,*p1,*p2,*p3; scanf(“%d,%d,%d”,&a,&b,&c); p1=&a,p2=&b,p3=&c; exchange(p1,p2,p3); printf(“%d,%d,%dn”,a,b,c);exchange(int *q1,int *q2,in
25、t *q3) if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3);swap(int *a,int *b) int t; t=*a,*a=*b,*b=t; 38例輸出數(shù)組的全部元素。例輸出數(shù)組的全部元素。方法一:下標(biāo)法方法一:下標(biāo)法int main() int a10; int i; for(i=0;i10;i+) scanf(“%d”,&ai); printf(“n”); for(i=0;i10;i+) printf(“%d,”,ai);return 0;方法二:地址法方法二:地址法int mai
26、n() int a10; int i; for(i=0;i10;i+) scanf(“%d”,&ai); printf(“n”); for(i=0;i10;i+) printf(“%d,”,*(a+i);return 0;39方法四:指針?lè)ǚ椒ㄋ模褐羔樂(lè)╥nt main() int a10,*p; int i; for(i=0;i10;i+) scanf(%d,&ai); printf(n); p=&a0; for(i=0;i10;i+) printf(%3d,*(p+i); printf(n); return 0;例輸出數(shù)組的全部元素。例輸出數(shù)組的全部元素。方法三:指
27、針?lè)ǚ椒ㄈ褐羔樂(lè)╥nt main() int a10; int *p,i; for(i=0;i10;i+) scanf(“%d”,&ai); printf(“n”); for(p=a;pa+10;p+) printf(“%d,”,*p); return 0;三種方法的比較:三種方法的比較: 方法方法1與方法與方法2的執(zhí)行效率相的執(zhí)行效率相同,都是先計(jì)算數(shù)組元素的同,都是先計(jì)算數(shù)組元素的地址,再訪(fǎng)問(wèn)數(shù)組元素的值,地址,再訪(fǎng)問(wèn)數(shù)組元素的值,費(fèi)時(shí)。費(fèi)時(shí)。 方法方法3利用指針變量直接訪(fǎng)利用指針變量直接訪(fǎng)問(wèn)數(shù)組元素的值,不必計(jì)算問(wèn)數(shù)組元素的值,不必計(jì)算數(shù)組元素的地址,故執(zhí)行效數(shù)組元素的地址,故
28、執(zhí)行效率高。率高。 下標(biāo)法直觀(guān),指針?lè)ㄅc地址下標(biāo)法直觀(guān),指針?lè)ㄅc地址法不夠直觀(guān)。法不夠直觀(guān)。40例下面的程序的輸出結(jié)果是什么例下面的程序的輸出結(jié)果是什么? ?#include int a=2,4,7,8,9;int main() int i,*p=a; for(i=0;i4;i+) ai=*(+p); printf(%dn,a2);return 0; 運(yùn)行結(jié)果為:運(yùn)行結(jié)果為:8 8411.1.指針變量可以實(shí)現(xiàn)自身值的改變:如:指針變量可以實(shí)現(xiàn)自身值的改變:如:p+;p+;但數(shù)組名則不能進(jìn)行改變:但數(shù)組名則不能進(jìn)行改變:a+a+是錯(cuò)誤的用法是錯(cuò)誤的用法。2.2.應(yīng)注意指針變量的當(dāng)前值。應(yīng)注意指針
29、變量的當(dāng)前值。3.3.注意以下的指針運(yùn)算:注意以下的指針運(yùn)算:若:若:intint a10, a10,* *p=a;p=a;則:則:p+p+或或+p +p 等價(jià)于等價(jià)于 &a1&a1 * *p+ p+ 等價(jià)于等價(jià)于 * *(p+)(p+) 但但 * *(p+)(p+)與與* *(+p)(+p)卻不同卻不同 (* *p p)+等價(jià)于等價(jià)于 a0+a0+要點(diǎn):要點(diǎn):42例下面程序的錯(cuò)誤是什么例下面程序的錯(cuò)誤是什么? ?int main() int a10; int *p,i; p=a; for(i=0;i10;i+) scanf(“%d”,p+); printf(“n”); for
30、(i=0;i10;i+,p+) printf(“%d,”,*p); return 0;43例例1,用指針?lè)绞綄?shí)現(xiàn)字符串長(zhǎng)度函數(shù)。,用指針?lè)绞綄?shí)現(xiàn)字符串長(zhǎng)度函數(shù)。一種方式:一種方式:int strLength (const char *s) int n = 0; while (*s != 0) s+; n+; return n; 另一實(shí)現(xiàn):另一實(shí)現(xiàn):int strLength (const char *s) char *p = s; while (*p != 0) p+; return p - s;參數(shù)類(lèi)型參數(shù)類(lèi)型(char*),實(shí)參應(yīng)是字符串或存字符串的數(shù)組實(shí)參應(yīng)是字符串或存字符串的數(shù)組4.指
31、針與數(shù)組操作函數(shù)實(shí)例指針與數(shù)組操作函數(shù)實(shí)例指針使用非常靈活指針使用非常靈活44void strCopy(char *s, const char *t) while (*s = *t) != 0) s+; t+; 把指針更新操作也寫(xiě)在循環(huán)測(cè)試條件里,把指針更新操作也寫(xiě)在循環(huán)測(cè)試條件里,void strCopy (char *s, const char *t) while (*s+ = *t+) ; / 空語(yǔ)句空語(yǔ)句賦值表達(dá)式有值,賦值表達(dá)式有值,0就是就是0,可簡(jiǎn)化:,可簡(jiǎn)化:void strCopy(char *s, const char *t) while(*s = *t) s+; t+;
32、例例2,用指針實(shí)現(xiàn)字符串復(fù)制函數(shù)。,用指針實(shí)現(xiàn)字符串復(fù)制函數(shù)。45例例3 3,利用指針,輸出,利用指針,輸出int數(shù)組里一段元素?cái)?shù)組里一段元素:void prt_seq(int *begin, int *end) for (; begin != end; +begin) printf(%dn, *begin); prt_seq(a, a+10);prt_seq(a+5, a+10);prt_seq(a, a+3);prt_seq(a+2, a+6);prt_seq(a+4, a+4);prt_seq(a+10, a+10);最后兩個(gè)調(diào)用對(duì)應(yīng)空序列。最后兩個(gè)調(diào)用對(duì)應(yīng)空序列。46“設(shè)置設(shè)置”函數(shù):函數(shù):void set_seq(int *b, int *e, int v) for (; b != e; +b) *b = v; 把序列中每個(gè)元素都用其平
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《個(gè)人收入的分配》課件
- 一般現(xiàn)在時(shí)與現(xiàn)在進(jìn)行時(shí)區(qū)別課件
- 《EDGE優(yōu)化基礎(chǔ)知識(shí)》課件
- 《蘭亭集序》說(shuō)課稿 2023-2024學(xué)年統(tǒng)編版高中語(yǔ)文選擇性必修下冊(cè)
- 二零二五版女方離婚協(xié)議履行義務(wù)及違約責(zé)任合同
- 二零二五年度速凍粘玉米產(chǎn)品安全檢測(cè)與認(rèn)證合同
- 《電磁感應(yīng)》課件
- 《死亡學(xué)法醫(yī)學(xué)》課件
- 《銀行違規(guī)案例》課件
- 《油在線(xiàn)監(jiān)測(cè)裝置》課件
- 部編版小學(xué)語(yǔ)文四年級(jí)下冊(cè)教師教學(xué)用書(shū)(教學(xué)參考)完整版
- 初中生物面團(tuán)發(fā)酵實(shí)驗(yàn)報(bào)告
- 工程項(xiàng)目總投資的構(gòu)成及估算
- 串通招投標(biāo)法律問(wèn)題研究
- 高原鐵路建設(shè)衛(wèi)生保障
- 顳下頜關(guān)節(jié)盤(pán)復(fù)位固定術(shù)后護(hù)理查房
- 新版藥品管理法培訓(xùn)完整版本課件
- 醫(yī)院信息系統(tǒng)HIS知識(shí)培訓(xùn)教學(xué)課件-HIS的主要內(nèi)容
- 硝苯地平控釋片
- 合成聚氨酯原料及助劑生產(chǎn)項(xiàng)目
- 四川省瀘州市2019年中考物理考試真題與答案解析
評(píng)論
0/150
提交評(píng)論