第8章善于利用指針_第1頁
第8章善于利用指針_第2頁
第8章善于利用指針_第3頁
第8章善于利用指針_第4頁
第8章善于利用指針_第5頁
已閱讀5頁,還剩208頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、8.1 指指針針是什么是什么8.2 指針變量指針變量8.3 通過指針引用數(shù)組通過指針引用數(shù)組8.4 通過指針引用字符串通過指針引用字符串8.5 指向函數(shù)的指針指向函數(shù)的指針8.6 返回指針值的函數(shù)返回指針值的函數(shù)8.7 指針數(shù)組和多重指針指針數(shù)組和多重指針8.8 動態(tài)內(nèi)存分配與指向它的指針變量動態(tài)內(nèi)存分配與指向它的指針變量8.9 有關(guān)指針的小結(jié)有關(guān)指針的小結(jié)如果在程序中定義了一個變量,在對程序進(jìn)如果在程序中定義了一個變量,在對程序進(jìn)行編譯時,系統(tǒng)就會給行編譯時,系統(tǒng)就會給該該變量分配內(nèi)存單元變量分配內(nèi)存單元編譯系統(tǒng)根據(jù)程序中定義的變量類型,分配編譯系統(tǒng)根據(jù)程序中定義的變量類型,分配一定長度的空

2、間一定長度的空間例如,例如,VC+為整型變量分配為整型變量分配4個字節(jié),對個字節(jié),對單精度浮點(diǎn)型變量分配個字節(jié),對字符型單精度浮點(diǎn)型變量分配個字節(jié),對字符型變量分配個字節(jié)變量分配個字節(jié)內(nèi)存區(qū)的每一個字節(jié)有一個編號,這就是內(nèi)存區(qū)的每一個字節(jié)有一個編號,這就是“地址地址”,它相當(dāng)于旅館中的房間號。,它相當(dāng)于旅館中的房間號。在地址所標(biāo)在地址所標(biāo)識識的內(nèi)存單元中存放數(shù)據(jù),這相的內(nèi)存單元中存放數(shù)據(jù),這相當(dāng)于旅館房間中居住的旅客一樣。當(dāng)于旅館房間中居住的旅客一樣。由于通過地址能找到所需的變量單元,我們由于通過地址能找到所需的變量單元,我們可以說,可以說,地址指向該變量單元地址指向該變量單元。將地址形象化地

3、稱為將地址形象化地稱為“指針指針”務(wù)必弄清楚存儲單元的務(wù)必弄清楚存儲單元的地址地址和存儲和存儲單元的單元的內(nèi)容內(nèi)容這兩個概念的區(qū)別這兩個概念的區(qū)別例如:例如:int i=3,j=6,k;printf(“%d”,i);通過變量名通過變量名i找到找到i的地址的地址2000,從而,從而從從存存儲單元儲單元讀讀取取3int i=3,j=6,k;k=i+j;從這里取從這里取3將將9送到這里送到這里從這里取從這里取6直接存取直接存取int i=3,j=6,k;定義特殊變量定義特殊變量i_pointer將將i的地址的地址存到這里存到這里間接存取間接存取i_pointer=&i;*i_pointer=

4、50;5050i200032000i_pointer*i_pointer20003直接存取直接存取間接存取間接存取為了表示將數(shù)值送到變量中,可以有兩為了表示將數(shù)值送到變量中,可以有兩種表達(dá)方法:種表達(dá)方法:(1) 將將3直接送到變量直接送到變量i所標(biāo)識的單元中,例所標(biāo)識的單元中,例如:如:i=3; (2) 將將3送到變量送到變量i_pointer所指向的單元所指向的單元(即變量(即變量i的存儲單元),例如:的存儲單元),例如:*i_pointer=3; 其中其中*i_pointer表示表示i_pointer指向的對象指向的對象指向就是通過地址來體現(xiàn)的指向就是通過地址來體現(xiàn)的u假設(shè)假設(shè)i_poi

5、nter中的值是變量的地址中的值是變量的地址(2000),這樣就在,這樣就在i_pointer和變量之間和變量之間建立起一種聯(lián)系,即通過建立起一種聯(lián)系,即通過i_pointer能知道能知道i的地址,從而找到變量的地址,從而找到變量i的內(nèi)存單元的內(nèi)存單元由于通過地址能找到所需的變量單元,因由于通過地址能找到所需的變量單元,因此說,地址指向該變量單元此說,地址指向該變量單元將地址形象化地稱為將地址形象化地稱為“指針指針”。意思是通。意思是通過它能找到以它為地址的內(nèi)存單元過它能找到以它為地址的內(nèi)存單元一個變量的一個變量的地址地址稱為該變量的稱為該變量的“指針指針”例如,地址例如,地址2000是變量的

6、指針是變量的指針如果有一個變量專門用來存放另一變量的如果有一個變量專門用來存放另一變量的地址(即指針),則它稱為地址(即指針),則它稱為“指針變量指針變量”i_pointer就是一個指針變量。指針變量就是一個指針變量。指針變量就是地址變量,用來存放地址的變量,指就是地址變量,用來存放地址的變量,指針變量的值是地址(即指針)針變量的值是地址(即指針)“指針指針”和和“指針變量指針變量”是是不同的不同的概念概念可以說變量可以說變量i的指針是的指針是2000,而不能說,而不能說i的的指針變量是指針變量是2000指針是一個地址,而指針變量是存放地址指針是一個地址,而指針變量是存放地址的變量的變量8.2

7、.1使用指針變量的例子使用指針變量的例子8.2.2 怎樣定義指針變量怎樣定義指針變量8.2.3 怎樣引用指針變量怎樣引用指針變量8.2.4 指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)例例8.1 通通過指針變量訪問整型變量。過指針變量訪問整型變量。解題思路:先定義解題思路:先定義2個整型變量,再定個整型變量,再定義義2個指針變量,分別指向這兩個整型個指針變量,分別指向這兩個整型變量,通過訪問指針變量,可以找到它變量,通過訪問指針變量,可以找到它們所指向的變量,從而得到這些變量的們所指向的變量,從而得到這些變量的值。值。#include int main() int a=100,b=10; int

8、*pointer_1, *pointer_2; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%dn”,a,b); printf(“*pointer_1=%d,*pointer_2= %dn”,*pointer_1,*pointer_2); return 0;定義兩個指針變量定義兩個指針變量使使pointer_1指向指向a使使pointer_2指向指向b直接直接輸出變量輸出變量a和和b的值的值間接間接輸出變量輸出變量a和和b的值的值#include int main() int a=100,b=10; int *pointer_1, *p

9、ointer_2; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%dn”,a,b); printf(“*pointer_1=%d,*pointer_2= %dn”,*pointer_1,*pointer_2); return 0;此處此處*與與類型名類型名在一起。在一起。此時共同定義指針變量此時共同定義指針變量此處此處*與指針變量一起使用。此與指針變量一起使用。此時時代表指針變量所指向的變量代表指針變量所指向的變量定義指針變量的一般形式為:定義指針變量的一般形式為: 類型類型 * 指針變量名指針變量名;如:如:int *pointer_

10、1, *pointer_2;uint是是為為指針變量指定的指針變量指定的“基類型基類型”u基類型指定指針變量可指向的變量類型基類型指定指針變量可指向的變量類型u如如pointer_1可以指向整型變量,但不能指可以指向整型變量,但不能指向浮點(diǎn)型變量向浮點(diǎn)型變量下面都是合法的定義下面都是合法的定義和初始化和初始化:float *pointer_3;char *pointer_4;int a,b;int *pointer_1=&a,*pointer_2=&b;*pointer_1&a; 錯誤錯誤pointer_3&a; 錯誤錯誤pointer_1&a; 正確正

11、確pointer_32000; 錯誤錯誤在引用指針變量時,可能有三種情況:在引用指針變量時,可能有三種情況:u給指針變量賦值。如:給指針變量賦值。如:p=&a;u引用指針變量指向的變量引用指針變量指向的變量。如如有有 p=&a; *p=1; 則執(zhí)行則執(zhí)行printf(“%d”,*p); 將輸出將輸出1u引用指針變量的值。如:引用指針變量的值。如:printf(“%o”,p);使使p指向指向a*p相當(dāng)于相當(dāng)于a以以八八進(jìn)制輸進(jìn)制輸出出a的地址的地址要熟練掌握兩個有關(guān)的運(yùn)算符:要熟練掌握兩個有關(guān)的運(yùn)算符:(1) 取地址運(yùn)算符。取地址運(yùn)算符。 &a是變量是變量a的地址的地址(

12、2) * 指針運(yùn)算符(指針運(yùn)算符(“間接訪問間接訪問”運(yùn)算符)運(yùn)算符) 如果如果: p指向變量指向變量a,則則*p就代表就代表a。 k=*p; (把把a(bǔ)的值的值賦給賦給k) *p=1; (把把1賦給賦給a) 例例8.2 輸入輸入a和和b兩個整數(shù),按先大后小的兩個整數(shù),按先大后小的順序輸出順序輸出a和和b。解題思路:用指針方法來處理這個問題。解題思路:用指針方法來處理這個問題。不交換整型變量的值,而是交換兩個指針不交換整型變量的值,而是交換兩個指針變量的值。變量的值。#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:)

13、; 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(“%d,%dn”,*p1,*p2); return 0;abp1p2p59&a&b成立成立#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:); scanf(“%d,%d”,&a,&b); p1=&a; p2=&b; if(ab) p=p1; p1

14、=p2; p2=p; printf(“a=%d,b=%dn”,a,b); printf(“%d,%dn”,*p1,*p2); return 0;abp1p2p59&a&b&b&a#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:); 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(“%d,%dn”,*p1,*p2)

15、; return 0;abp1p2p59&a&b&b&a#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:); 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(“%d,%dn”,*p1,*p2); return 0;abp1p2p59&a&b&b&a可否改為可否改為p1=&b

16、; p2=&a;?注意注意:ua和和b的值并未交換,它們?nèi)员3衷档闹挡⑽唇粨Q,它們?nèi)员3衷祏但但p1和和p2的值改變了。的值改變了。p1的值原為的值原為&a,后,后來變成來變成&b,p2原值為原值為&b,后來變成,后來變成&au這樣在輸出這樣在輸出*p1和和*p2時,實(shí)際上是輸出變時,實(shí)際上是輸出變量量b和和a的值,所以先輸出的值,所以先輸出9,然后輸出,然后輸出5 例例8.3 題目要求同例題目要求同例8.2,即對輸入的兩,即對輸入的兩個整數(shù)按大小順序輸出?,F(xiàn)用函數(shù)處理,而個整數(shù)按大小順序輸出。現(xiàn)用函數(shù)處理,而且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。且用指針類

17、型的數(shù)據(jù)作函數(shù)參數(shù)。解題思路:定義一個函數(shù)解題思路:定義一個函數(shù)swap,將指向兩,將指向兩個整型變量的指針變量作為實(shí)參傳遞給個整型變量的指針變量作為實(shí)參傳遞給swap函數(shù)的形參指針變量,在函數(shù)中通過函數(shù)的形參指針變量,在函數(shù)中通過指針實(shí)現(xiàn)交換兩個變量的值。指針實(shí)現(xiàn)交換兩個變量的值。#include int main()void swap(int *p1,int *p2); int a,b; int*pointer_1,*pointer_2; printf(please enter a and b:); scanf(“%d,%d”,&a,&b); pointer_1=&

18、a; pointer_2=&b; if (ab) swap(pointer_1,pointer_2); printf(“max=%d,min=%dn”,a,b); return 0; abpointer_159&a&bpointer_2void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;abpointer_159&a&bpointer_2p1&ap2&b95void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p

19、2; *p2=temp;void swap(int *p1,int *p2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp;錯!錯!無確定的指向無確定的指向#include int main() if (ab) swap(a,b); printf(“max=%d,min=%dn”,a,b); return 0; void swap(int x,int y) int temp; temp=x; x=y; y=temp; 錯!錯!無法交換無法交換a,bab59xy5995如果想通過函數(shù)調(diào)用得到個要改變的值如果想通過函數(shù)調(diào)用得到個要改變的值: 在主調(diào)函數(shù)中設(shè)個變量

20、,用個指針變量指在主調(diào)函數(shù)中設(shè)個變量,用個指針變量指向它們向它們 設(shè)計(jì)一個函數(shù),有設(shè)計(jì)一個函數(shù),有n個指針形參。在這個函數(shù)個指針形參。在這個函數(shù)中改變這個形參的值中改變這個形參的值 在主調(diào)函數(shù)中調(diào)用這個函數(shù),在調(diào)用時將這在主調(diào)函數(shù)中調(diào)用這個函數(shù),在調(diào)用時將這n個指針變量作實(shí)參,將它們的地址傳給該函數(shù)個指針變量作實(shí)參,將它們的地址傳給該函數(shù)的形參的形參 在執(zhí)行該函數(shù)的過程中,通過形參指針變量,在執(zhí)行該函數(shù)的過程中,通過形參指針變量,改變它們所指向的個變量的值改變它們所指向的個變量的值主調(diào)函數(shù)中就可以使用這些改變了值的變量主調(diào)函數(shù)中就可以使用這些改變了值的變量例例8.4 對輸入的兩個整數(shù)按大小順序

21、輸出。對輸入的兩個整數(shù)按大小順序輸出。解題思路:嘗試調(diào)用解題思路:嘗試調(diào)用swap函數(shù)來實(shí)現(xiàn)題函數(shù)來實(shí)現(xiàn)題目要求。在函數(shù)中改變形參目要求。在函數(shù)中改變形參(指針變量指針變量)的的值,希望能由此改變實(shí)參值,希望能由此改變實(shí)參(指針變量指針變量)的值的值#include int main() void swap(int *p1,int *p2); int a,b; int*pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if (ab) swap(pointer_1,point

22、er_2); printf(max=%d,min=%dn,a,b); return 0; void swap(int *p1,int *p2) int *p; p=p1; p1=p2; p2=p;錯!錯!只交換形參指向只交換形參指向注意:函數(shù)的調(diào)用可以(而且只可以)得注意:函數(shù)的調(diào)用可以(而且只可以)得到一個返回值(即函數(shù)值),而使用指針到一個返回值(即函數(shù)值),而使用指針變量作參數(shù),可以得到多個變化了的值。變量作參數(shù),可以得到多個變化了的值。如果不用指針變量是難以做到這一點(diǎn)的。如果不用指針變量是難以做到這一點(diǎn)的。要善于利用指針法。要善于利用指針法。 例例8.5 輸入輸入3個整數(shù)個整數(shù)a,b,

23、c,要求按由大,要求按由大到小的順序?qū)⑺鼈冚敵觥S煤瘮?shù)實(shí)現(xiàn)。到小的順序?qū)⑺鼈冚敵?。用函?shù)實(shí)現(xiàn)。解題思路:采用例解題思路:采用例8.3的方法在函數(shù)中改的方法在函數(shù)中改變這變這3個變量的值。用個變量的值。用swap函數(shù)交換兩函數(shù)交換兩個變量的值,用個變量的值,用exchange函數(shù)改變這函數(shù)改變這3個變量的值。個變量的值。#include int main() void exchange(int *q1, int *q2, int *q3); int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d,&a,&b,&c); p1=&a;p2=&

24、;b;p3=&c; exchange(p1,p2,p3); printf(“%d,%d,%dn,a,b,c); return 0;調(diào)用結(jié)束后不會調(diào)用結(jié)束后不會改變指針的指向改變指針的指向void exchange(int *q1, int *q2, int *q3) void swap(int *pt1, int *pt2); if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3); void swap(int *pt1, int *pt2) int temp; temp=*pt1; *pt1=*pt

25、2; *pt2=temp; 交換指針指交換指針指向的變量值向的變量值8.3.1 數(shù)組元素的指針數(shù)組元素的指針8.3.2 在引用數(shù)組元素時指針的運(yùn)算在引用數(shù)組元素時指針的運(yùn)算8.3.3 通過指針引用數(shù)組元素通過指針引用數(shù)組元素8.3.4 用數(shù)組名作函數(shù)參數(shù)用數(shù)組名作函數(shù)參數(shù)8.3.5 通過指針引用多維數(shù)組通過指針引用多維數(shù)組一個變量有地址,一個數(shù)組包含若干元素一個變量有地址,一個數(shù)組包含若干元素,每個數(shù)組元素都有相應(yīng)的地址,每個數(shù)組元素都有相應(yīng)的地址指針變量可以指向數(shù)組元素(把某一元素指針變量可以指向數(shù)組元素(把某一元素的地址放到一個指針變量中)的地址放到一個指針變量中)所謂數(shù)組元素的指針就是數(shù)

26、組元素的地址所謂數(shù)組元素的指針就是數(shù)組元素的地址可以用一個指針變量指向一個數(shù)組元素可以用一個指針變量指向一個數(shù)組元素 int a10=1,3,5,7,9,11,13,15,17,19; int *p; p=&a0;等價于等價于p=a;等價于等價于int *p=a;或或int *p=&a0;注意注意:數(shù)組名數(shù)組名a不代表整個數(shù)組,不代表整個數(shù)組,只代表數(shù)組首元素的地址。只代表數(shù)組首元素的地址?!皃=a;”的作用是的作用是“把把a(bǔ)數(shù)組的首元素的地?cái)?shù)組的首元素的地址賦給指針變量址賦給指針變量p”,而不是,而不是“把把數(shù)組數(shù)組a各元素的值賦給各元素的值賦給p”。在指針指向數(shù)組元素時,在

27、指針指向數(shù)組元素時,允許允許以下運(yùn)算:以下運(yùn)算:u加一個整數(shù)加一個整數(shù)(用用+或或+=),如,如p+1u減一個整數(shù)減一個整數(shù)(用用-或或-=),如,如p-1u自加運(yùn)算,如自加運(yùn)算,如p+,+pu自減運(yùn)算,如自減運(yùn)算,如p-,-pu兩個指針相減,如兩個指針相減,如p1-p2 (只有只有p1和和p2都都指向同一數(shù)組中的元素時才有意義指向同一數(shù)組中的元素時才有意義)(1) 如果指針變量如果指針變量p已指向數(shù)組中的一個元已指向數(shù)組中的一個元素,則素,則p+1指向同一數(shù)組中的下一個元素指向同一數(shù)組中的下一個元素,p-1指向同一數(shù)組中的上一個元素。指向同一數(shù)組中的上一個元素。 float a10,*p=a

28、; 假設(shè)假設(shè)a0的地址為的地址為2000,則,則up的值為的值為2000up+1的值為的值為2004uP-1的值為的值為1996越界越界(2) 如果的初如果的初值為值為&a0,則則p+i和和a+i就就是數(shù)組元素是數(shù)組元素ai的地址,的地址,或者說,它們或者說,它們指向指向a數(shù)組序號數(shù)組序號為為i的元素的元素a0a1a2a3a4a5a6a7a8a9pp+1,a+1 p+i,a+i p+9,a+9 (3) *(p+i)或或*(a+i)是是p+i或或a+i所指向所指向的數(shù)組元素,的數(shù)組元素,即即ai。a0a1a2a3a4a5a6a7a8a9pp+1,a+1 p+i,a+i p+9,a+9 *

29、(p+i)(4) 如果指針如果指針p1和和p2都指向同一數(shù)組都指向同一數(shù)組 p2-p1的值的值是是4 不能不能p1+p2a0a1a2a3a4a5a6a7a8a9p1p2 引用一個數(shù)組元素,可用下面兩種方法:引用一個數(shù)組元素,可用下面兩種方法: ()() 下標(biāo)法,如下標(biāo)法,如ai形式形式 ()() 指針法,如指針法,如*(a+i)或或*(p+i) 其中其中a是數(shù)組名,是數(shù)組名,p是指向數(shù)組元素的指針是指向數(shù)組元素的指針變量,其初值變量,其初值p=a 例例8.6 有一個整型數(shù)組有一個整型數(shù)組a,有,有10個元素,個元素,要求輸出數(shù)組中的全部元素。要求輸出數(shù)組中的全部元素。解題思路:引用數(shù)組中各元素

30、的值有解題思路:引用數(shù)組中各元素的值有3種種方法:方法:(1)下標(biāo)法下標(biāo)法;(2)通過數(shù)組名計(jì)算通過數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值數(shù)組元素地址,找出元素的值;(3) 用指用指針變量指向數(shù)組元素針變量指向數(shù)組元素分別寫出程序,以資比較分析。分別寫出程序,以資比較分析。(1) 下標(biāo)法。下標(biāo)法。 #include int main() int a10; int i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,ai); printf(%n

31、); return 0; (2) 通過數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值通過數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值#include int main() int a10; int i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,*(a+i); printf(n); return 0; scanf(%d,a+i);(3) 用指針變量指向數(shù)組元素用指針變量指向數(shù)組元素 #include int main() int a10; int *p,

32、i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(p=a;p(a+10);p+) printf(“%d ”,*p); printf(n); return 0;for(p=a;p(a+10);p+) scanf(%d,p);for(p=a;p(a+10);a+) printf(“%d ”,*a); 錯!錯!3種方法的比較:種方法的比較: 第第(1)和第和第(2)種方法執(zhí)行效率相同種方法執(zhí)行效率相同u編譯系統(tǒng)是將編譯系統(tǒng)是將ai轉(zhuǎn)換為轉(zhuǎn)換為*(a+i)處理的,處理的,即先計(jì)算元素地址。即先計(jì)

33、算元素地址。u因此用第因此用第(1)和第和第(2)種方法找數(shù)組元素費(fèi)時種方法找數(shù)組元素費(fèi)時較多。較多。3種方法的比較:種方法的比較: 第第(3)種方法比第種方法比第(1)、第、第(2)種方法快種方法快u用指針變量直接指向元素,不必每次都重新計(jì)用指針變量直接指向元素,不必每次都重新計(jì)算地址,像算地址,像p+這樣的自加操作是比較快的這樣的自加操作是比較快的u這種有規(guī)律地改變地址值這種有規(guī)律地改變地址值(p+)能大大提高能大大提高執(zhí)行效率執(zhí)行效率3種方法的比較:種方法的比較: 用下標(biāo)法比較直觀,能直接知道是第幾個用下標(biāo)法比較直觀,能直接知道是第幾個元素。元素。 用地址法或指針變量的方法不直觀,難以用

34、地址法或指針變量的方法不直觀,難以很快地判斷出當(dāng)前處理的是哪一個元素。很快地判斷出當(dāng)前處理的是哪一個元素。 例例8.7 通過指針變量輸出整型數(shù)組通過指針變量輸出整型數(shù)組a的的10個元素。個元素。解題思路:解題思路: 用指針變量用指針變量p指向數(shù)組元素,通過改變指指向數(shù)組元素,通過改變指針變量的值,使針變量的值,使p先后指向先后指向a0到到a9各各元素。元素。#include int main() int *p,i,a10; p=a; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(“%d”,p+); for(i=0;i10;

35、i+,p+) printf(“%d ”,*p); printf(n); return 0;退出循環(huán)時退出循環(huán)時p指向指向a9后面的存儲單元后面的存儲單元因此執(zhí)行此因此執(zhí)行此循環(huán)出問題循環(huán)出問題重新執(zhí)行重新執(zhí)行p=a;用數(shù)組名作函數(shù)參數(shù)時,因?yàn)閷?shí)參數(shù)組名用數(shù)組名作函數(shù)參數(shù)時,因?yàn)閷?shí)參數(shù)組名代表該數(shù)組首元素的地址,形參應(yīng)該是一代表該數(shù)組首元素的地址,形參應(yīng)該是一個指針變量個指針變量C編譯都是將形參數(shù)組名作為指針變量來編譯都是將形參數(shù)組名作為指針變量來處理的處理的int main() void fun(int arr,int n; int array10; fun (array,10); retur

36、n 0; void fun(int arr ,int n) fun(int *arr,int n)int main() void fun(int arr,int n; int array10; fun (array,10); return 0; void fun(int *arr,int n) array0arr0array數(shù)組數(shù)組arrarray3arr3arr+3 實(shí)參數(shù)組名是指針常量,但形參數(shù)組名是實(shí)參數(shù)組名是指針常量,但形參數(shù)組名是按指針變量處理按指針變量處理在函數(shù)調(diào)用進(jìn)行虛實(shí)結(jié)合后,它的值就是在函數(shù)調(diào)用進(jìn)行虛實(shí)結(jié)合后,它的值就是實(shí)參數(shù)組首元素的地址實(shí)參數(shù)組首元素的地址在函數(shù)執(zhí)行期間,

37、在函數(shù)執(zhí)行期間,形參數(shù)組形參數(shù)組可以再被賦值可以再被賦值void fun (arr ,int n) printf(%dn, *arr); arr=arr+3; printf(%dn, *arr); 例例8.8 將數(shù)組將數(shù)組a中中n個整數(shù)按相反順序存放個整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對換,對換,將將a4與與a5對換。對換。ji例例8.8 將數(shù)組將數(shù)組a中中n個整數(shù)按相反順序存放個整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對換,對換,將將a4與與a5對換。對換。ji例例8.8 將數(shù)組將數(shù)組a中中n個整數(shù)按相反順序存放個整數(shù)按相反順序存放解題思路:將解題思

38、路:將a0與與an-1對換,對換,將將a4與與a5對換。對換。ji例例8.8 將數(shù)組將數(shù)組a中中n個整數(shù)按相反順序存放個整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對換,對換,將將a4與與a5對換。對換。ji例例8.8 將數(shù)組將數(shù)組a中中n個整數(shù)按相反順序存放個整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對換,對換,將將a4與與a5對換。對換。ji#include int main() void inv(int x ,int n); int i, a10=3,7,9,11,0,6,7,5,4,2; for(i=0;i10;i+) printf(“%d ”,ai);

39、printf(n); inv(a,10); for(i=0;i10;i+) printf(“%d ”,ai); printf(n); return 0;void inv(int x ,int n) int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; temp=xi;xi=xj;xj=temp; void inv(int x ,int n) int temp,*i,*j; i=x; j=x+n-1; for( ; ij; i+,j-) temp=*i; *i=*j; *j=temp; 優(yōu)化優(yōu)化例例8.9 改寫例改寫例8.8,用指針變量作實(shí)參。,用指針

40、變量作實(shí)參。#include int main() void inv(int *x,int n); int i, arr10,*p=arr; for(i=0;i10;i+,p+) scanf(“%d”,p); inv(p,10); for(p=arr;parr+10;p+) printf(“%d ”,*p); printf(n); return 0;不可少!不可少! 例例8.10 用指針方法對用指針方法對10個整數(shù)按由大到個整數(shù)按由大到小順序排序。小順序排序。解題思路:解題思路:u在主函數(shù)中定義數(shù)組在主函數(shù)中定義數(shù)組a存放存放10個整數(shù),定義個整數(shù),定義int *型指針變量型指針變量p指向指向

41、a0u定義函數(shù)定義函數(shù)sort使數(shù)組使數(shù)組a中的元素按由大到小的中的元素按由大到小的順序排列順序排列u在主函數(shù)中調(diào)用在主函數(shù)中調(diào)用sort函數(shù),用指針函數(shù),用指針p作實(shí)參作實(shí)參u用選擇法進(jìn)行排序用選擇法進(jìn)行排序#include int main() void sort(int x ,int n); int i,*p,a10; p=a; for(i=0;i10;i+) scanf(“%d”,p+); p=a; sort(p,10); for(p=a,i=0;i10;i+) printf(“%d ”,*p); p+; printf(n); return 0;void sort(int x,int

42、n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jxk) k=j; if(k!=i) t=xi;xi=xk;xk=t; void sort(int *x,int n)if (*(x+j)*(x+k) k=j;t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;指針變量可以指向一維數(shù)組中的元素,也指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素。但在概念上可以指向多維數(shù)組中的元素。但在概念上和使用方法上,多維數(shù)組的指針比一維數(shù)和使用方法上,多維數(shù)組的指針比一維數(shù)組的指針要復(fù)雜一些。組的指針要復(fù)雜一些。1. 多維數(shù)組元素的地址

43、多維數(shù)組元素的地址int a34=1,3,5,7, 9,11,13,15,17,19,21,23;1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針a代表第代表第0行首地址行首地址a+1代表第代表第1行首地址行首地址a+2代表第代表第2行首地址行首地址1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針行指針每加行指針每加1,走一行,走一行a+i代表行號為代表行號為i的行首地址(按行變化)的行首地址(按行變化)*(a+i)代表什么?代表什么?135791

44、1131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針相當(dāng)于相當(dāng)于aia0代表代表a00的地址的地址a0+1代表代表a01的地址的地址a0+2代表代表a02的地址的地址a0+3代表代表a03的地址的地址1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針列指針每加列指針每加1,走一列,走一列a1代表誰的地址?代表誰的地址?a1+1代表誰的地址?代表誰的地址?a1+2代表誰的地址?代表誰的地址?a1+3代表誰的地址?代表誰的地址?1357911131517192123a0

45、a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針ai+j代表誰的地址?代表誰的地址?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針代表代表aij的地址的地址*(ai+j)代表什么?代表什么?代表元素代表元素aij*(*(a+i)+j)代表什么?代表什么?與與*(ai+j)等價等價例例8.11 二維數(shù)組的有關(guān)數(shù)據(jù)二維數(shù)組的有關(guān)數(shù)據(jù)(地址和值地址和值)#include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23; printf(“%d

46、,%dn”,a,*a); printf(“%d,%dn”,a0,*(a+0); printf(“%d,%dn”,&a0,&a00); printf(“%d,%dn”,a1,a+1); printf(“%d,%dn”,&a10,*(a+1)+0); printf(“%d,%dn”,a2,*(a+2); printf(“%d,%dn”,&a2,a+2); printf(“%d,%dn”,a10,*(*(a+1)+0); printf(“%d,%dn”,*a2,*(*(a+2)+0); return 0; printf(“%d,%dn”,a,*a); printf(“

47、%d,%dn”,a0,*(a+0); printf(“%d,%dn”,&a0,&a00); printf(“%d,%dn”,a1,a+1); printf(“%d,%dn”,&a10,*(a+1)+0); printf(“%d,%dn”,a2,*(a+2); printf(“%d,%dn”,&a2,a+2); printf(“%d,%dn”,a10,*(*(a+1)+0); printf(“%d,%dn”,*a2,*(*(a+2)+0); return 0; printf(“%d,%dn”,a,*a); printf(“%d,%dn”,a0,*(a+0); pr

48、intf(“%d,%dn”,&a0,&a00); printf(“%d,%dn”,a1,a+1); printf(“%d,%dn”,&a10,*(a+1)+0); printf(“%d,%dn”,a2,*(a+2); printf(“%d,%dn”,&a2,a+2); printf(“%d,%dn”,a10,*(*(a+1)+0); printf(“%d,%dn”,*a2,*(*(a+2)+0); return 0;2. 指向多維數(shù)組元素的指針變量指向多維數(shù)組元素的指針變量(1) 指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量 例例8.12 有一個有一個34的二維

49、數(shù)組,要求的二維數(shù)組,要求用指向元素的指針變量輸出二維數(shù)組各用指向元素的指針變量輸出二維數(shù)組各元素的值。元素的值。解題思路:解題思路:u二維數(shù)組的元素是整型的,它相當(dāng)于整型變二維數(shù)組的元素是整型的,它相當(dāng)于整型變量,可以用量,可以用int*型指針變量指向它型指針變量指向它u二維數(shù)組的元素在內(nèi)存中是按行順序存放的二維數(shù)組的元素在內(nèi)存中是按行順序存放的,即存放完序號為,即存放完序號為0的行中的全部元素后,的行中的全部元素后,接著存放序號為接著存放序號為1的行中的全部元素,依此的行中的全部元素,依此類推類推u因此可以用一個指向整型元素的指針變量,因此可以用一個指向整型元素的指針變量,依次指向各個元素

50、依次指向各個元素#include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) printf(“n”); printf(“%4d”,*p); printf(n); return 0;控制換行控制換行逐個訪問各元素時常用此類指針逐個訪問各元素時常用此類指針(2) 指向由個元素組成的一維數(shù)組的指針指向由個元素組成的一維數(shù)組的指針變量變量 例例8.13 輸出二維數(shù)組任一行任一列元素的輸出二維數(shù)組任一行任一列元素的值。值。解題思路:假設(shè)仍然用例解題思路:假設(shè)仍然

51、用例8.12程序中的二程序中的二維數(shù)組,例維數(shù)組,例8.12中定義的指針變量是指向中定義的指針變量是指向變量或數(shù)組元素的,現(xiàn)在改用指向一維數(shù)變量或數(shù)組元素的,現(xiàn)在改用指向一維數(shù)組的指針變量。組的指針變量。#include int main()int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int (*p)4,i,j; p=a; printf(“enter row and colum:); scanf(“%d,%d”,&i,&j); printf(“a%d,%d=%dn”, i,j,*(*(p+i)+j); return 0;行指針行指針aij3

52、. 用指向數(shù)組的指針作函數(shù)參數(shù)用指向數(shù)組的指針作函數(shù)參數(shù)一維數(shù)組名可以作為函數(shù)參數(shù),多維數(shù)組一維數(shù)組名可以作為函數(shù)參數(shù),多維數(shù)組名也可作函數(shù)參數(shù)。名也可作函數(shù)參數(shù)。用指針變量作形參,以接受實(shí)參數(shù)組名傳用指針變量作形參,以接受實(shí)參數(shù)組名傳遞來的地址。遞來的地址??梢杂袃煞N方法:可以有兩種方法:用指向變量的指針變量用指向變量的指針變量用指向一維數(shù)組的指針變量用指向一維數(shù)組的指針變量 例例8.14 有一個班,有一個班,3個學(xué)生,各學(xué)個學(xué)生,各學(xué)4門課,門課,計(jì)算總平均分?jǐn)?shù)以及第計(jì)算總平均分?jǐn)?shù)以及第n個學(xué)生的成績。個學(xué)生的成績。 解題思路:這個題目是很簡單的。本例用指解題思路:這個題目是很簡單的。本例

53、用指向數(shù)組的指針作函數(shù)參數(shù)。用函數(shù)向數(shù)組的指針作函數(shù)參數(shù)。用函數(shù)average求總平均成績,用函數(shù)求總平均成績,用函數(shù)search找找出并輸出第出并輸出第i個學(xué)生的成績。個學(xué)生的成績。#include int main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60, 80,87,90,81,90,99,100,98; average(*score,12); search(score,2); return 0;score00的地址的地址void average(f

54、loat *p,int n) float *p_end; float sum=0,aver; p_end=p+n-1; for( ;p=p_end; p+) sum=sum+(*p); aver=sum/n; printf(average=%5.2fn,aver);6567706080879081909910098pp_endp+1#include int main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60, 80,87,90,81,90,99,100,98

55、; average(*score,12); search(score,2); return 0;二維數(shù)組首行地址二維數(shù)組首行地址void search(float (*p)4,int n) int i; printf(The score of No.%d are:n,n); for(i=0;i4;i+) printf(%5.2f ,*(*(p+n)+i); printf(n);6567706080879081909910098pp+2 例例8.15 在上題基礎(chǔ)上,查找有一門以上在上題基礎(chǔ)上,查找有一門以上課程不及格的學(xué)生,輸出他們的全部課程課程不及格的學(xué)生,輸出他們的全部課程的成績。的成績。解

56、題思路:在主函數(shù)中定義二維數(shù)組解題思路:在主函數(shù)中定義二維數(shù)組score,定義,定義search函數(shù)實(shí)現(xiàn)輸出有一函數(shù)實(shí)現(xiàn)輸出有一門以上課程不及格的學(xué)生的全部課程的成門以上課程不及格的學(xué)生的全部課程的成績,形參績,形參p的類型是的類型是float(*)4。在調(diào)。在調(diào)用用search函數(shù)時,用函數(shù)時,用score作為實(shí)參,作為實(shí)參,把把score0的地址傳給形參的地址傳給形參p。#include int main() void search(float (*p)4,int n); float score34=65,57,70,60, 58,87,90,81,90,99,100,98; search

57、(score,3); return 0;void search(float (*p)4,int n) int i,j,flag; for(j=0;jn;j+) flag=0; for(i=0;i4;i+) if(*(*(p+j)+i)60) flag=1; if(flag=1) printf(No.%d failsn,j+1); for(i=0;i4;i+) printf(“%5.1f ”,*(*(p+j)+i); printf(n); 65 57706058 87908190 99 10098pvoid search(float (*p)4,int n) int i,j,flag; for(

58、j=0;jn;j+) flag=0; for(i=0;i4;i+) if(*(*(p+j)+i)60) flag=1; if(flag=1) printf(No.%d failsn,j+1); for(i=0;i4;i+) printf(“%5.1f ”,*(*(p+j)+i); printf(n); 發(fā)現(xiàn)發(fā)現(xiàn)不及格不及格,賦,賦1若有若有不及格不及格,則輸出,則輸出不用不用flag,而用,而用break語句如何改程序?語句如何改程序?8.4.1 字符串的引用方式字符串的引用方式8.4.2 字符指針作函數(shù)參數(shù)字符指針作函數(shù)參數(shù)8.4.3 使用字符指針變量和字符數(shù)組的比較使用字符指針變量和字符數(shù)

59、組的比較字符串是存放在字符數(shù)組中的。引用一個字符串是存放在字符數(shù)組中的。引用一個字符串,可以用以下兩種方法。字符串,可以用以下兩種方法。(1) 用字符數(shù)組存放一個字符串,可以通過數(shù)組用字符數(shù)組存放一個字符串,可以通過數(shù)組名和格式聲明名和格式聲明“%s”輸出該字符串,也可以輸出該字符串,也可以通過數(shù)組名和下標(biāo)引用字符串中一個字符。通過數(shù)組名和下標(biāo)引用字符串中一個字符。(2) 用字符指針變量指向一個字符串常量,通過用字符指針變量指向一個字符串常量,通過字符指字符指針針變量引用字符串常量。變量引用字符串常量。 例例8.16 定義一個字符數(shù)組,在其中存放定義一個字符數(shù)組,在其中存放字符串字符串“I l

60、ove China!”,輸出該字符,輸出該字符串和第串和第8個字符。個字符。解題思路:定義字符數(shù)組解題思路:定義字符數(shù)組string,對它初,對它初始化,由于在初始化時字符的個數(shù)是確定始化,由于在初始化時字符的個數(shù)是確定的,因此可不必指定數(shù)組的長度。用數(shù)組的,因此可不必指定數(shù)組的長度。用數(shù)組名名string和輸出格式和輸出格式%s可以輸出整個字可以輸出整個字符串。用數(shù)組名和下標(biāo)可以引用任一數(shù)組符串。用數(shù)組名和下標(biāo)可以引用任一數(shù)組元素。元素。#include int main() char string=“I love China!”; printf(“%sn”,string); printf(

61、“%cn”,string7); return 0;stringstring+7 例例8.17 通過字符指針變量輸出一個字符串。通過字符指針變量輸出一個字符串。 解題思路:可以不定義字符數(shù)組,只定義一解題思路:可以不定義字符數(shù)組,只定義一個字符指針變量,用它指向字符串常量中的個字符指針變量,用它指向字符串常量中的字符。通過字符指針變量輸出該字符串。字符。通過字符指針變量輸出該字符串。#include int main() char *string=“I love China!”; printf(“%sn”,string); return 0;stringchar *string; string=” I love China!”; #in

溫馨提示

  • 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

提交評論