




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、8.1 指針是什么指針是什么8.2 指針變量指針變量8.3 通過(guò)指針引用數(shù)組通過(guò)指針引用數(shù)組8.4 通過(guò)指針引用字符串通過(guò)指針引用字符串8.5 指向函數(shù)的指針指向函數(shù)的指針8.6 返回指針值的函數(shù)返回指針值的函數(shù)8.7 指針數(shù)組和多重指針指針數(shù)組和多重指針8.8 動(dòng)態(tài)內(nèi)存分配與指向它的指針變量動(dòng)態(tài)內(nèi)存分配與指向它的指針變量8.9 有關(guān)指針的小結(jié)有關(guān)指針的小結(jié)如果在程序中定義了一個(gè)變量,在對(duì)程序進(jìn)如果在程序中定義了一個(gè)變量,在對(duì)程序進(jìn)行編譯時(shí),系統(tǒng)就會(huì)給該變量分配內(nèi)存單元行編譯時(shí),系統(tǒng)就會(huì)給該變量分配內(nèi)存單元編譯系統(tǒng)根據(jù)程序中定義變量時(shí)指定的類型,編譯系統(tǒng)根據(jù)程序中定義變量時(shí)指定的類型,分配一定
2、長(zhǎng)度的空間。分配一定長(zhǎng)度的空間。例如,例如,VC+為整型變量分配為整型變量分配4個(gè)字節(jié),對(duì)個(gè)字節(jié),對(duì)單精度浮點(diǎn)型變量分配個(gè)字節(jié),對(duì)字符型單精度浮點(diǎn)型變量分配個(gè)字節(jié),對(duì)字符型變量分配個(gè)字節(jié)變量分配個(gè)字節(jié)內(nèi)存區(qū)的每一個(gè)字節(jié)有一個(gè)編號(hào),這就是內(nèi)存區(qū)的每一個(gè)字節(jié)有一個(gè)編號(hào),這就是“地址地址”,它相當(dāng)于旅館中的房間號(hào)。,它相當(dāng)于旅館中的房間號(hào)。在地址所標(biāo)識(shí)的內(nèi)存單元中存放數(shù)據(jù),這相在地址所標(biāo)識(shí)的內(nèi)存單元中存放數(shù)據(jù),這相當(dāng)于旅館房間中居住的旅客一樣。當(dāng)于旅館房間中居住的旅客一樣。由于通過(guò)地址能找到所需的變量單元,我們由于通過(guò)地址能找到所需的變量單元,我們可以說(shuō),地址指向該變量單元。可以說(shuō),地址指向該變量單
3、元。將地址形象化地稱為將地址形象化地稱為“指針指針”“指針和指針和“指針變量是不同的概念指針變量是不同的概念指針是一個(gè)地址,而指針變量是存放地址指針是一個(gè)地址,而指針變量是存放地址的變量的變量8.2.1使用指針變量的例子使用指針變量的例子8.2.2 怎樣定義指針變量怎樣定義指針變量8.2.3 怎樣引用指針變量怎樣引用指針變量8.2.4 指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)例例8.1 通過(guò)指針變量訪問(wèn)整型變量。通過(guò)指針變量訪問(wèn)整型變量。解題思路:先定義解題思路:先定義2個(gè)整型變量,再定義個(gè)整型變量,再定義2個(gè)指針變量,分別指向這兩個(gè)整型變個(gè)指針變量,分別指向這兩個(gè)整型變量,通過(guò)訪問(wèn)指針變量,
4、可以找到它們量,通過(guò)訪問(wèn)指針變量,可以找到它們所指向的變量,從而得到這些變量的值。所指向的變量,從而得到這些變量的值。#include int main() int a=100,b=10; int *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;定義兩個(gè)指針變量定義兩個(gè)指針變量使使pointer_1指向指向a使使pointer_2
5、指向指向b直接輸出變量直接輸出變量a和和b的值的值間接輸出變量間接輸出變量a和和b的值的值#include int main() int a=100,b=10; int *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;此處此處*與類型名在一起。與類型名在一起。此時(shí)共同定義指針變量此時(shí)共同定義指針變量此處此處*與指針變量一起使用。此
6、與指針變量一起使用。此時(shí)代表指針變量所指向的變量時(shí)代表指針變量所指向的變量定義指針變量的一般形式為:定義指針變量的一般形式為: 類型類型 * 指針變量名指針變量名;如:如:int *pointer_1, *pointer_2;int是為指針變量指定的是為指針變量指定的“基類型基類型”基類型指定指針變量可指向的變量類型基類型指定指針變量可指向的變量類型如如pointer_1可以指向整型變量,但不可以指向整型變量,但不能指向浮點(diǎn)型變量能指向浮點(diǎn)型變量下面都是合法的定義和初始化:下面都是合法的定義和初始化:float *pointer_3;char *pointer_4;int a,b;int *p
7、ointer_1=&a,*pointer_2=&b;*pointer_1&a; 錯(cuò)誤錯(cuò)誤pointer_3&a; 錯(cuò)誤錯(cuò)誤pointer_1&a; 正確正確pointer_32000; 錯(cuò)誤錯(cuò)誤要熟練掌握兩個(gè)有關(guān)的運(yùn)算符:要熟練掌握兩個(gè)有關(guān)的運(yùn)算符:(1) 取地址運(yùn)算符。取地址運(yùn)算符。 &a是變量是變量a的地址的地址(2) * 指針運(yùn)算符(指針運(yùn)算符(“間接訪問(wèn)運(yùn)算符間接訪問(wèn)運(yùn)算符) 假設(shè):假設(shè): p指向變量指向變量a,那么,那么*p就代表就代表a。 k=*p; (把把a(bǔ)的值賦給的值賦給k) *p=1; (把把1賦給賦給a) 例例8.2 輸入輸入
8、a和和b兩個(gè)整數(shù),按先大后小的兩個(gè)整數(shù),按先大后小的順序輸出順序輸出a和和b。解題思路:用指針?lè)椒▉?lái)處理這個(gè)問(wèn)題。不解題思路:用指針?lè)椒▉?lái)處理這個(gè)問(wèn)題。不交換整型變量的值,而是交換兩個(gè)指針變交換整型變量的值,而是交換兩個(gè)指針變量的值。量的值。#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(“
9、%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=p2; p2=p; printf(“a=%d,b=%dn”,a,b); printf(“%d,%dn”,*p1,*p2); return 0;abp1p2p59&a&b&b&a#include
10、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#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:); sca
11、nf(“%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; p2=&a;?留意留意:a和和b的值并未交換,它們?nèi)员3衷档闹挡⑽唇粨Q,它們?nèi)员3衷档玴1和和p2的值改變了。的值改變了。p1的值原為的值原為&a,后來(lái)變成,后來(lái)變成&b,p2原值為原值為&am
12、p;b,后來(lái)變成,后來(lái)變成&a這樣在輸出這樣在輸出*p1和和*p2時(shí),實(shí)際上是輸出時(shí),實(shí)際上是輸出變量變量b和和a的值,所以先輸出的值,所以先輸出9,然后輸出,然后輸出5 例例8.3 題目要求同例題目要求同例8.2,即對(duì)輸入的兩,即對(duì)輸入的兩個(gè)整數(shù)按大小順序輸出。現(xiàn)用函數(shù)處理,而個(gè)整數(shù)按大小順序輸出?,F(xiàn)用函數(shù)處理,而且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。解題思路:定義一個(gè)函數(shù)解題思路:定義一個(gè)函數(shù)swap,將指向兩,將指向兩個(gè)整型變量的指針變量作為實(shí)參傳遞給個(gè)整型變量的指針變量作為實(shí)參傳遞給swap函數(shù)的形參指針變量,在函數(shù)中通過(guò)函數(shù)的形參指針變量,在函數(shù)中通過(guò)指
13、針實(shí)現(xiàn)交換兩個(gè)變量的值。指針實(shí)現(xiàn)交換兩個(gè)變量的值。#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=&a; pointer_2=&b; if (ab) swap(pointer_1,pointer_2); printf(“max=%d,min=%dn”,a,b); return 0; abpointer_159&a&a
14、mp;bpointer_2void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;abpointer_159&a&bpointer_2p1&ap2&b95#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; 錯(cuò)!錯(cuò)!無(wú)法交換無(wú)法交換a,bab59xy59958.3.1 數(shù)組元素的指
15、針數(shù)組元素的指針8.3.2 在引用數(shù)組元素時(shí)指針的運(yùn)算在引用數(shù)組元素時(shí)指針的運(yùn)算8.3.3 通過(guò)指針引用數(shù)組元素通過(guò)指針引用數(shù)組元素8.3.4 用數(shù)組名作函數(shù)參數(shù)用數(shù)組名作函數(shù)參數(shù)8.3.5 通過(guò)指針引用多維數(shù)組通過(guò)指針引用多維數(shù)組一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都有相應(yīng)的地址,每個(gè)數(shù)組元素都有相應(yīng)的地址指針變量可以指向數(shù)組元素把某一元素指針變量可以指向數(shù)組元素把某一元素的地址放到一個(gè)指針變量中)的地址放到一個(gè)指針變量中)所謂數(shù)組元素的指針就是數(shù)組元素的地址所謂數(shù)組元素的指針就是數(shù)組元素的地址可以用一個(gè)指針變量指向一個(gè)數(shù)組元素可以用一個(gè)指針
16、變量指向一個(gè)數(shù)組元素 int a10=1,3,5,7,9,11,13,15,17,19; int *p; p=&a0;等價(jià)于等價(jià)于p=a;等價(jià)于等價(jià)于int *p=a;或或int *p=&a0;留意:數(shù)組名留意:數(shù)組名a不代表整個(gè)數(shù)組,不代表整個(gè)數(shù)組,只代表數(shù)組首元素的地址。只代表數(shù)組首元素的地址。“p=a;”的作用是的作用是“把把a(bǔ)數(shù)組的首元素的地?cái)?shù)組的首元素的地址賦給指針變量址賦給指針變量p”,而不是,而不是“把把數(shù)組數(shù)組a各元素的值賦給各元素的值賦給p”。在指針指向數(shù)組元素時(shí),允許以下運(yùn)算:在指針指向數(shù)組元素時(shí),允許以下運(yùn)算:加一個(gè)整數(shù)加一個(gè)整數(shù)(用用+或或+=),如,如
17、p+1減一個(gè)整數(shù)減一個(gè)整數(shù)(用用-或或-=),如,如p-1自加運(yùn)算,如自加運(yùn)算,如p+,+p自減運(yùn)算,如自減運(yùn)算,如p-,-p兩個(gè)指針相減,如兩個(gè)指針相減,如p1-p2 (只有只有p1和和p2都指向同一數(shù)組中的元素時(shí)才有意義都指向同一數(shù)組中的元素時(shí)才有意義)(1) 如果指針變量如果指針變量p已指向數(shù)組中的一個(gè)元已指向數(shù)組中的一個(gè)元素,則素,則p+1指向同一數(shù)組中的下一個(gè)元素指向同一數(shù)組中的下一個(gè)元素,p-1指向同一數(shù)組中的上一個(gè)元素。指向同一數(shù)組中的上一個(gè)元素。 float a10,*p=a; 假設(shè)假設(shè)a0的地址為的地址為2000,那么,那么p的值為的值為2000p+1的值為的值為2019P-
18、1的值為的值為2019越界越界(2) 如果的初如果的初值為值為&a0,則則p+i和和a+i就就是數(shù)組元素是數(shù)組元素ai的地址,的地址,或者說(shuō),它們或者說(shuō),它們指向指向a數(shù)組序號(hào)數(shù)組序號(hào)為為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 *(p+i)(4) 如果指針如果指針p1和和p2都指向同一數(shù)組都指向同一數(shù)組 p2-p1的值是的值是4 不能
19、不能p1+p2a0a1a2a3a4a5a6a7a8a9p1p2 引用一個(gè)數(shù)組元素,可用下面兩種方法:引用一個(gè)數(shù)組元素,可用下面兩種方法: ()() 下標(biāo)法,如下標(biāo)法,如ai方式方式 ()() 指針?lè)?,如指針?lè)?,?(a+i)或或*(p+i) 其中其中a是數(shù)組名,是數(shù)組名,p是指向數(shù)組元素的指是指向數(shù)組元素的指針變量,其初值針變量,其初值p=a 例例8.6 有一個(gè)整型數(shù)組有一個(gè)整型數(shù)組a,有,有10個(gè)元素,個(gè)元素,要求輸出數(shù)組中的全部元素。要求輸出數(shù)組中的全部元素。解題思路:引用數(shù)組中各元素的值有解題思路:引用數(shù)組中各元素的值有3種方種方法:法:(1)下標(biāo)法;下標(biāo)法;(2)通過(guò)數(shù)組名計(jì)算數(shù)通過(guò)數(shù)
20、組名計(jì)算數(shù)組元素地址,找出元素的值;組元素地址,找出元素的值;(3) 用指針用指針變量指向數(shù)組元素變量指向數(shù)組元素分別寫(xiě)出程序,以資比較分析。分別寫(xiě)出程序,以資比較分析。(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); return 0; (2) 通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找
21、出元素的值#include int main() int a10; int i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,a+i); for(i=0;i10;i+) printf(“%d ”,*(a+i); printf(n); return 0; (3) 用指針變量指向數(shù)組元素用指針變量指向數(shù)組元素 #include int main() int a10; int *p,i; printf(“enter 10 integer numbers:n); for(p=a;p(a+10);p+) scanf(%d,p
22、); for(p=a;p(a+10);p+) printf(“%d ”,*p); printf(n); return 0;用數(shù)組名作函數(shù)參數(shù)時(shí),因?yàn)閷?shí)參數(shù)組名用數(shù)組名作函數(shù)參數(shù)時(shí),因?yàn)閷?shí)參數(shù)組名代表該數(shù)組首元素的地址,形參應(yīng)該是一代表該數(shù)組首元素的地址,形參應(yīng)該是一個(gè)指針變量個(gè)指針變量C編譯都是將形參數(shù)組名作為指針變量來(lái)編譯都是將形參數(shù)組名作為指針變量來(lái)處理的處理的int main() void fun(int arr,int n; int array10; fun (array,10); return 0; void fun(int arr ,int n) fun(int *arr,int
23、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í)行期間,形參數(shù)組可以再被賦值在函數(shù)執(zhí)行期間,形參數(shù)組可以再被賦值void fun (int arr ,
24、int n) printf(%dn, *arr); arr=arr+3; printf(%dn, *arr); 例例8.8 將數(shù)組將數(shù)組a中中n個(gè)整數(shù)按相反順序存放個(gè)整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對(duì)換,對(duì)換,將將a4與與a5對(duì)換。對(duì)換。ji例例8.8 將數(shù)組將數(shù)組a中中n個(gè)整數(shù)按相反順序存放個(gè)整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對(duì)換,對(duì)換,將將a4與與a5對(duì)換。對(duì)換。ji例例8.8 將數(shù)組將數(shù)組a中中n個(gè)整數(shù)按相反順序存放個(gè)整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對(duì)換,對(duì)換,將將a4與與a5對(duì)換。對(duì)換。ji例例8.8 將數(shù)組將
25、數(shù)組a中中n個(gè)整數(shù)按相反順序存放個(gè)整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對(duì)換,對(duì)換,將將a4與與a5對(duì)換。對(duì)換。ji例例8.8 將數(shù)組將數(shù)組a中中n個(gè)整數(shù)按相反順序存放個(gè)整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對(duì)換,對(duì)換,將將a4與與a5對(duì)換。對(duì)換。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); printf(n); inv(a,10); for(i=0;i10;i+) print
26、f(“%d ”,ai); printf(n); return 0;void inv(int x ,int n) int temp,i,j;j=n-1; for(i=0;ij;i+,j-) temp=xi;xi=xj;xj=temp; 例例8.9 改寫(xiě)例改寫(xiě)例8.8,用指針變量作實(shí)參。,用指針變量作實(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)
27、; printf(n); return 0;不可少!不可少!void inv(int *x,int n) int temp,i,j;j=n-1; for(i=0;ij;i+,j-) temp=*(x+i);*(x+i)=*(x+j); *(x+j)=temp; 例例8.10 用指針?lè)椒▽?duì)用指針?lè)椒▽?duì)10個(gè)整數(shù)按由大到個(gè)整數(shù)按由大到小順序排序。小順序排序。解題思路:解題思路:在主函數(shù)中定義數(shù)組在主函數(shù)中定義數(shù)組a存放存放10個(gè)整數(shù),定義個(gè)整數(shù),定義int *型指針變量型指針變量p指向指向a0定義函數(shù)定義函數(shù)sort使數(shù)組使數(shù)組a中的元素按由大到小中的元素按由大到小的順序排列的順序排列在主函數(shù)中調(diào)
28、用在主函數(shù)中調(diào)用sort函數(shù),用指針函數(shù),用指針p作實(shí)參作實(shí)參用選擇法進(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 n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jxk) k=j;
29、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ù)組元素的地址多維數(shù)組元素的地址int a34=1,3,5,7, 9,11,13,15,17,19,21,23;135791113
30、1517192123a0a1a2aa+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代表行號(hào)為代表行號(hào)為i的行首地址按行變化)的行首地址按行變化)*(a+i)代表什么?代表什么?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針相當(dāng)于相當(dāng)
31、于aia0代表代表a00的地址的地址a0+1代表代表a01的地址的地址a0+2代表代表a02的地址的地址a0+3代表代表a03的地址的地址1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針列指針每加列指針每加1,走一列,走一列a1代表誰(shuí)的地址?代表誰(shuí)的地址?a1+1代表誰(shuí)的地址?代表誰(shuí)的地址?a1+2代表誰(shuí)的地址?代表誰(shuí)的地址?a1+3代表誰(shuí)的地址?代表誰(shuí)的地址?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針ai+j代表誰(shuí)的地址?代表誰(shuí)的地址?13
32、57911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針代表代表aij的地址的地址*(ai+j)代表什么?代表什么?代表元素代表元素aij*(*(a+i)+j)代表什么?代表什么?與與*(ai+j)等價(jià)等價(jià)2. 指向多維數(shù)組元素的指針變量指向多維數(shù)組元素的指針變量(1) 指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量 例例8.12 有一個(gè)有一個(gè)34的二維數(shù)組,要求的二維數(shù)組,要求用指向元素的指針變量輸出二維數(shù)組各用指向元素的指針變量輸出二維數(shù)組各元素的值。元素的值。#include int main() int a34=1,3,5,7
33、,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;控制換行控制換行逐個(gè)訪問(wèn)各元素時(shí)常用此類指針逐個(gè)訪問(wèn)各元素時(shí)常用此類指針(2) 指向由個(gè)元素組成的一維數(shù)組的指針指向由個(gè)元素組成的一維數(shù)組的指針變量變量 例例8.13 輸出二維數(shù)組任一行任一列元素的輸出二維數(shù)組任一行任一列元素的值。值。#include int main()int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int
34、 (*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;行指針行指針aij8.4.1 字符串的引用方式字符串的引用方式8.4.2 字符指針作函數(shù)參數(shù)字符指針作函數(shù)參數(shù)8.4.3 使用字符指針變量和字符數(shù)組的比較使用字符指針變量和字符數(shù)組的比較引用一個(gè)字符串,可以用以下兩種方法。引用一個(gè)字符串,可以用以下兩種方法。(1) 用字符數(shù)組存放一個(gè)字符串,可以通用字符數(shù)組存放一個(gè)字符串,可以通過(guò)數(shù)組名和過(guò)數(shù)組名和
35、 “%s輸出該字符串,也可輸出該字符串,也可以通過(guò)數(shù)組名和下標(biāo)引用字符串中一個(gè)字以通過(guò)數(shù)組名和下標(biāo)引用字符串中一個(gè)字符。符。(2) 用字符指針變量指向一個(gè)字符串常量用字符指針變量指向一個(gè)字符串常量,通過(guò)字符指針變量引用字符串常量。,通過(guò)字符指針變量引用字符串常量。 例例8.16 定義一個(gè)字符數(shù)組,在其中存放定義一個(gè)字符數(shù)組,在其中存放字符串字符串“I love China!”,輸出該字符串,輸出該字符串和第和第8個(gè)字符。個(gè)字符。解題思路:定義字符數(shù)組解題思路:定義字符數(shù)組string,對(duì)它初始,對(duì)它初始化。用數(shù)組名化。用數(shù)組名string和和%s可以輸出整個(gè)可以輸出整個(gè)字符串。用數(shù)組名和下標(biāo)可
36、以引用任一數(shù)字符串。用數(shù)組名和下標(biāo)可以引用任一數(shù)組元素。組元素。#include int main() char string=“I love China!”; printf(“%sn”,string); printf(“%cn”,string7); return 0; 例例8.17 通過(guò)字符指針變量輸出一個(gè)字符串。通過(guò)字符指針變量輸出一個(gè)字符串。 解題思路:可以不定義字符數(shù)組,只定義一個(gè)解題思路:可以不定義字符數(shù)組,只定義一個(gè)字符指針變量,用它指向字符串常量中的字字符指針變量,用它指向字符串常量中的字符。通過(guò)字符指針變量輸出該字符串。符。通過(guò)字符指針變量輸出該字符串。#include int
37、 main() char *string=“I love China!”; printf(“%sn”,string); return 0;stringchar *string; string=” I love China!”; #include int main() char *string=“I love China!”; printf(“%sn”,string); string=”I am a student.”; printf(“%sn”,string); return 0;string#include int main() char *string=“I love China!”; p
38、rintf(“%sn”,string); string=”I am a student.”; printf(“%sn”,string); return 0;string 例例8.18 將字符串將字符串a(chǎn)復(fù)制為字符串復(fù)制為字符串b,然后輸,然后輸出字符串出字符串b。解題思路:定義兩個(gè)字符數(shù)組解題思路:定義兩個(gè)字符數(shù)組a和和b,用,用“I am a student.”對(duì)對(duì)a數(shù)組初始化。將數(shù)組初始化。將a數(shù)數(shù)組中的字符逐個(gè)復(fù)制到組中的字符逐個(gè)復(fù)制到b數(shù)組中。數(shù)組中。#include int main() char a =“I am a student.”,b20; int i; for(i=0;ai
39、!=0;i+) bi=ai; bi=0; printf(“string a is:%sn”,a); printf(string b is:); for(i=0;bi!=0;i+) printf(“%c”,bi); printf(n); return 0;printf(string b is:%sn“,b); 例例8.19 用指針變量來(lái)處理例用指針變量來(lái)處理例8.18問(wèn)題。問(wèn)題。解題思路:定義兩個(gè)指針變量解題思路:定義兩個(gè)指針變量p1和和p2,分,分別指向字符數(shù)組別指向字符數(shù)組a和和b。改變指針變量。改變指針變量p1和和p2的值,使它們順序指向數(shù)組中的各元的值,使它們順序指向數(shù)組中的各元素,進(jìn)行
40、對(duì)應(yīng)元素的復(fù)制。素,進(jìn)行對(duì)應(yīng)元素的復(fù)制。#include int main()char a=I am a boy.,b20,*p1,*p2; p1=a; p2=b; for( ; *p1!=0; p1+,p2+) *p2=*p1; *p2=0; printf(“string a is:%sn”,a); printf(“string b is:%sn”,b); return 0;例例8.20 用函數(shù)調(diào)用實(shí)現(xiàn)字符串的復(fù)制。用函數(shù)調(diào)用實(shí)現(xiàn)字符串的復(fù)制。解題思路:定義一個(gè)函數(shù)解題思路:定義一個(gè)函數(shù)copy_string用用來(lái)實(shí)現(xiàn)字符串復(fù)制的功能,在主函數(shù)中調(diào)來(lái)實(shí)現(xiàn)字符串復(fù)制的功能,在主函數(shù)中調(diào)用此函數(shù)
41、用此函數(shù).#include int main()void copy_string(char *from, char *to) ; char a=“I am a teacher.”; char b=“you are a student.”; char *from=a,*to=b; printf(“a=%snb=%sn,a,b); printf(ncopy string a to string b:n); copy_string(from,to); printf(“a=%snb=%sn,a,b); return 0;void copy_string(char *from, char *to) fo
42、r( ;*from!=0; from+,to+) *to=*from; *to=0; (1) 賦值方式。可以對(duì)字符指針變量賦值賦值方式??梢詫?duì)字符指針變量賦值,但不能對(duì)數(shù)組名賦值。,但不能對(duì)數(shù)組名賦值。char *a; a=”I love China!”; 對(duì)對(duì)char str14; str=”I love China!”; 錯(cuò)錯(cuò)(2) 字符數(shù)組中各元素的值是可以改變的字符數(shù)組中各元素的值是可以改變的,但字符指針變量指向的字符串常量中的,但字符指針變量指向的字符串常量中的內(nèi)容是不可以被取代的。內(nèi)容是不可以被取代的。char a=”House”,*b=” House”;a2=r; 對(duì)對(duì)char
43、a=”House”,*b=”House”;b2=r; 錯(cuò)錯(cuò)8.5.1什么是函數(shù)指針什么是函數(shù)指針8.5.2用函數(shù)指針變量調(diào)用函數(shù)用函數(shù)指針變量調(diào)用函數(shù)如果在程序中定義了一個(gè)函數(shù),在編譯如果在程序中定義了一個(gè)函數(shù),在編譯時(shí),編譯系統(tǒng)為函數(shù)代碼分配一段存儲(chǔ)時(shí),編譯系統(tǒng)為函數(shù)代碼分配一段存儲(chǔ)空間,這段存儲(chǔ)空間的起始地址,稱為空間,這段存儲(chǔ)空間的起始地址,稱為這個(gè)函數(shù)的指針。這個(gè)函數(shù)的指針??梢远x一個(gè)指向函數(shù)的指針變量,用來(lái)可以定義一個(gè)指向函數(shù)的指針變量,用來(lái)存放某一函數(shù)的起始地址,這就意味著此存放某一函數(shù)的起始地址,這就意味著此指針變量指向該函數(shù)。指針變量指向該函數(shù)。定義指向函數(shù)的指針變量的一般形
44、式為定義指向函數(shù)的指針變量的一般形式為 數(shù)據(jù)類型數(shù)據(jù)類型 (*指針變量名指針變量名)(函數(shù)參數(shù)表列函數(shù)參數(shù)表列); 如如 int (*p)(int,int);例例8.22 用函數(shù)求整數(shù)用函數(shù)求整數(shù)a和和b中的大者。中的大者。解題思路:定義一個(gè)函數(shù)解題思路:定義一個(gè)函數(shù)max,實(shí)現(xiàn)求兩,實(shí)現(xiàn)求兩個(gè)整數(shù)中的大者。在主函數(shù)調(diào)用個(gè)整數(shù)中的大者。在主函數(shù)調(diào)用max函函數(shù),除了可以通過(guò)函數(shù)名調(diào)用外,還可數(shù),除了可以通過(guò)函數(shù)名調(diào)用外,還可以通過(guò)指向函數(shù)的指針變量來(lái)實(shí)現(xiàn)。分以通過(guò)指向函數(shù)的指針變量來(lái)實(shí)現(xiàn)。分別編程并作比較。別編程并作比較。(1通過(guò)函數(shù)名調(diào)用函數(shù)通過(guò)函數(shù)名調(diào)用函數(shù)#include int mai
45、n() int max(int,int); int a,b,c; printf(please enter a and b:); scanf(%d,%d,&a,&b); c=max(a,b); printf(“%d,%d,max=%dn,a,b,c); return 0;int max(int x,int y) int z; if(xy) z=x; else z=y; return(z);(2)通過(guò)指針變量訪問(wèn)它所指向的函數(shù)通過(guò)指針變量訪問(wèn)它所指向的函數(shù)#include int main() int max(int,int); int (*p)(int,int); int a,b
46、,c; p=max; printf(please enter a and b:); scanf(%d,%d,&a,&b); c=(*p)(a,b); printf(“%d,%d,max=%dn,a,b,c); return 0;必須先指向,若寫(xiě)成必須先指向,若寫(xiě)成p=max(a,b); 錯(cuò)錯(cuò)只能指向函數(shù)返回只能指向函數(shù)返回值為整型且有兩個(gè)值為整型且有兩個(gè)整型參數(shù)的函數(shù)整型參數(shù)的函數(shù)一個(gè)函數(shù)可以返回一個(gè)整型值、字符值一個(gè)函數(shù)可以返回一個(gè)整型值、字符值、實(shí)型值等,也可以返回指針型的數(shù)據(jù)、實(shí)型值等,也可以返回指針型的數(shù)據(jù),即地址。其概念與以前類似,只是返,即地址。其概念與以前類似,只
47、是返回的值的類型是指針類型而已回的值的類型是指針類型而已定義返回指針值的函數(shù)的一般形式為定義返回指針值的函數(shù)的一般形式為 類型名類型名 *函數(shù)名函數(shù)名(參數(shù)表列參數(shù)表列); 例例8.25有有a個(gè)學(xué)生,每個(gè)學(xué)生有個(gè)學(xué)生,每個(gè)學(xué)生有b門(mén)課門(mén)課程的成績(jī)。要求在用戶輸入學(xué)生序號(hào)以程的成績(jī)。要求在用戶輸入學(xué)生序號(hào)以后,能輸出該學(xué)生的全部成績(jī)。用指針后,能輸出該學(xué)生的全部成績(jī)。用指針函數(shù)實(shí)現(xiàn)。函數(shù)實(shí)現(xiàn)。 解題思路:解題思路:定義二維數(shù)組定義二維數(shù)組score存放成績(jī)存放成績(jī)定義查找函數(shù)定義查找函數(shù)search,返回值為指針,返回值為指針主函數(shù)將主函數(shù)將score和要找的學(xué)號(hào)和要找的學(xué)號(hào)k傳遞給傳遞給sea
48、rch函數(shù)的返回值是函數(shù)的返回值是&scorek0(k號(hào)學(xué)生的號(hào)學(xué)生的序號(hào)為序號(hào)為0的課程地址的課程地址)在主函數(shù)中輸出該生的全部成績(jī)?cè)谥骱瘮?shù)中輸出該生的全部成績(jī)#include int main()float score 4=60,70,80,90, 56,89,67,88,34,78,90,66; float *search(float (*pointer)4,int n); float *p; int i,k; scanf(“%d”,&k); printf(The scores of No.%d are:n,k); p=search(score,k); for(i=0;i
49、4;i+) printf(“%5.2ft”,*(p+i); printf(n); return 0;返回返回k號(hào)學(xué)生課程首地址號(hào)學(xué)生課程首地址float *search(float (*pointer)4,int n) float *pt; pt=*(pointer+n); return(pt);8.7.1 什么是指針數(shù)組什么是指針數(shù)組8.7.2 指向指針數(shù)據(jù)的指針指向指針數(shù)據(jù)的指針8.7.3 指針數(shù)組作指針數(shù)組作main函數(shù)的形參函數(shù)的形參一個(gè)數(shù)組,若其元素均為指針類型數(shù)一個(gè)數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說(shuō),指針據(jù),稱為指針數(shù)組,也就是說(shuō),指針數(shù)組中的每一個(gè)元素都存放一
50、個(gè)地址數(shù)組中的每一個(gè)元素都存放一個(gè)地址,相當(dāng)于一個(gè)指針變量。,相當(dāng)于一個(gè)指針變量。定義一維指針數(shù)組的一般形式為定義一維指針數(shù)組的一般形式為 類型名類型名*數(shù)組名數(shù)組名數(shù)組長(zhǎng)度數(shù)組長(zhǎng)度; int *p4;指針數(shù)組比較適合用來(lái)指向若干個(gè)字指針數(shù)組比較適合用來(lái)指向若干個(gè)字符串,使字符串處理更加方便靈活符串,使字符串處理更加方便靈活可以分別定義一些字符串,然后用指可以分別定義一些字符串,然后用指針數(shù)組中的元素分別指向各字符串針數(shù)組中的元素分別指向各字符串由于各字符串長(zhǎng)度一般是不相等的,由于各字符串長(zhǎng)度一般是不相等的,所以比用二維數(shù)組節(jié)省內(nèi)存單元所以比用二維數(shù)組節(jié)省內(nèi)存單元 例例8.27 將若干字符串按
51、字母順序由將若干字符串按字母順序由小到大輸出。小到大輸出。解題思路:定義一個(gè)指針數(shù)組,用各字解題思路:定義一個(gè)指針數(shù)組,用各字符串對(duì)它進(jìn)行初始化,然后用選擇法符串對(duì)它進(jìn)行初始化,然后用選擇法排序,但不是移動(dòng)字符串,而是改變排序,但不是移動(dòng)字符串,而是改變指針數(shù)組的各元素的指向。指針數(shù)組的各元素的指向。#include #include int main()void sort(char *name ,int n); void print(char *name ,int n); char *name =“Follow”,“Great”, “FORTRAN”,“Computer”; int n=4;
52、 sort(name,n); print(name,n); return 0;F o ll o w0G r e a t0F O R T R A N0C o m p u ter0void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2name3v
53、oid sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2name3i=0時(shí)時(shí)執(zhí)行后執(zhí)行后k變?yōu)樽優(yōu)?void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i
54、; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2name3void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w0G r e a t
55、0F O R T R A N0C o m p u ter0name0name1name2name3i=1時(shí)時(shí)執(zhí)行后執(zhí)行后k變?yōu)樽優(yōu)?void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2name3void sort(char *name ,i
56、nt n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2name3i=2時(shí)時(shí)執(zhí)行后執(zhí)行后k變?yōu)樽優(yōu)?void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j;
57、if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2name3void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w0G r e a t0F O R T R A N0C o m p
58、 u ter0name0name1name2name3void sort(char *name ,int n) char *temp; int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2name3void print(char *name ,int n) int i; for(i=0;in;i+) printf(“%s
59、n”,namei); F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2name3void print(char *name ,int n) int i; for(i=0;in;i+) printf(“%sn”,namei); 在了解了指針數(shù)組的基礎(chǔ)上,需要了在了解了指針數(shù)組的基礎(chǔ)上,需要了解指向指針數(shù)據(jù)的指針變量,簡(jiǎn)稱為解指向指針數(shù)據(jù)的指針變量,簡(jiǎn)稱為指向指針的指針。指向指針的指針。F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2nam
60、e3namep例例8.28 使用指向指針數(shù)據(jù)的指針變量。使用指向指針數(shù)據(jù)的指針變量。 char *name=“Follow”,“Great”, “FORTRAN”,“Computer”; char *p; int i; for(i=0;i5;i+) p=name+i; printf(%sn,*p); F o ll o w0G r e a t0F O R T R A N0C o m p u ter0name0name1name2name3namep 例例8.29 有一個(gè)指針數(shù)組,其元素分別指向有一個(gè)指針數(shù)組,其元素分別指向一個(gè)整型數(shù)組的元素,用指向指針數(shù)據(jù)的一個(gè)整型數(shù)組的元素,用指向指針數(shù)據(jù)的指針變量,輸出整型數(shù)組各元素的值。指針變量,輸出整型數(shù)組各元素的值。#include int main()int a5=1,3,5,7,9; int *num5=&a0,&a1,&a2, &a3,&a4; int *p,i; p=num; for(i=0;i5;i+) printf(%d ,*p); p+; printf(n); return 0; &a0&a1&a2&a3&a4p12345指針數(shù)組的一個(gè)重要應(yīng)用是作為指針數(shù)組的一個(gè)重要應(yīng)用是作為main函數(shù)的形參。在以往的程序中
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 共享個(gè)人倉(cāng)庫(kù)合同范本
- 創(chuàng)業(yè)園合作合同范本
- 2025年腎上腺皮質(zhì)激素類藥項(xiàng)目合作計(jì)劃書(shū)
- 第五單元信息獲取與交流第16課二、《網(wǎng)上購(gòu)物》教學(xué)設(shè)計(jì) 2023-2024學(xué)年人教版初中信息技術(shù)七年級(jí)上冊(cè)
- 2025年酶(酵)素制劑項(xiàng)目提案報(bào)告模板
- 2025年電流測(cè)量?jī)x表項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告模稿
- 2024湖南郴州市永興銀都投資發(fā)展集團(tuán)有限公司招聘人員筆試參考題庫(kù)附帶答案詳解
- 2025年溫控儀表項(xiàng)目申請(qǐng)報(bào)告模稿
- 第二單元第11課《數(shù)據(jù)分析報(bào)告》教學(xué)設(shè)計(jì) 2023-2024學(xué)年浙教版(2020)初中信息技術(shù)七年級(jí)上冊(cè)
- 2025年食品粉碎切割機(jī)械項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 融合智慧數(shù)據(jù)的圖書(shū)館數(shù)智服務(wù)平臺(tái)研究
- 2025年春新人教版語(yǔ)文一年級(jí)下冊(cè)全冊(cè)課件
- 2025年春新北師大版數(shù)學(xué)七年級(jí)下冊(cè)全冊(cè)教案
- 第七章老年人泌尿系統(tǒng)疾病
- 2025年中智科技集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年山東省郵政招聘筆試參考題庫(kù)含答案解析
- 血透室停電停水應(yīng)急預(yù)案
- 人教版小學(xué)數(shù)學(xué)三年級(jí)下冊(cè)第一單元《位置與方向(一)》單元測(cè)試
- 《零售藥店實(shí)務(wù)》期末考試復(fù)習(xí)題及答案
- 校園安全案例解析
- 電力變壓器聲紋檢測(cè)技術(shù)導(dǎo)則
評(píng)論
0/150
提交評(píng)論