




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 九 章指 針1第 九 章指 針19.1 地址和指針的概念 指針是C語(yǔ)言的一個(gè)重要概念,也是C語(yǔ)言的一個(gè)重要特色。深刻理解和正確使用指針是學(xué)習(xí)本章的基本要求。 本章是一個(gè)難點(diǎn),也是一個(gè)重點(diǎn),初學(xué)者不易掌握。在理解和熟悉基本內(nèi)容的前提下,上機(jī)實(shí)驗(yàn)是必不可少的環(huán)節(jié)。29.1 地址和指針的概念 指針是C語(yǔ)言的一個(gè)9.1 地址和指針的概念正確靈活的運(yùn)用指針可以有效表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)能動(dòng)態(tài)分配內(nèi)存方便使用字符串方便有效的使用數(shù)組調(diào)用函數(shù)時(shí)可以得到多個(gè)值能直接處理內(nèi)存地址39.1 地址和指針的概念正確靈活的運(yùn)用指針39.1 地址和指針的概念數(shù)據(jù)在內(nèi)存中是如何存取的?例:在程序中定義了一個(gè)變量,在編譯時(shí)給
2、這個(gè)變量分配內(nèi)存單元,根據(jù)定義的變量類型,分配一定長(zhǎng)度空間內(nèi)存中的每一個(gè)字節(jié)有一個(gè)編號(hào),這就是地址,在地址所標(biāo)志的內(nèi)存單元中存放數(shù)據(jù)49.1 地址和指針的概念數(shù)據(jù)在內(nèi)存中是如何存取的?49.1 地址和指針的概念一、地址 在計(jì)算機(jī)中,把內(nèi)存區(qū)劃分為一個(gè)一個(gè)的存儲(chǔ)單元,每個(gè)單元為一個(gè)字節(jié)(位),它們都有一個(gè)編號(hào),這個(gè)編號(hào)就是內(nèi)存地址。如下圖所示:注意:1、程序中定義的每個(gè)數(shù)據(jù)在編譯后都占有各自的內(nèi)存區(qū)。2、數(shù)據(jù)所占有的存儲(chǔ)單元個(gè)數(shù)是由其類型決定的。3、首地址:第1個(gè)單元的地址4、表示地址的數(shù)與整數(shù)的區(qū)別59.1 地址和指針的概念一、地址 在計(jì)算機(jī)中9.1 地址和指針的概念二、舉例 如有定義:cha
3、r c=A; int a=3; 則所占內(nèi)存情況如下:注意:c和a的地址可能相鄰,也可能不相鄰,是由系統(tǒng)分配的,我們不用關(guān)心。69.1 地址和指針的概念二、舉例 如有定義:char 9.1地址和指針的概念三、直接訪問(wèn)和間接訪問(wèn) 有兩個(gè)上鎖且放著物品的盒子A、B, 如果你有A盒子的鑰匙,則可以直接打開(kāi)A盒子將物品取出; 如果你有B盒子的鑰匙,而A盒子的鑰匙在B盒子中,要想取出A盒子中的物品,則必須先打開(kāi)B盒子,取出A盒子的鑰匙,再打開(kāi)A盒子將物品取出。 上面兩種情況就是直接訪問(wèn)和間接訪問(wèn)的概念。79.1地址和指針的概念三、直接訪問(wèn)和間接訪問(wèn) 9.1地址和指針的概念1、直接訪問(wèn) 通過(guò)變量本身對(duì)變量進(jìn)
4、行存取的方式,稱為直接訪問(wèn)。 如定義:int x; 則x=9; x+=5; 等等 這種訪問(wèn)方式只需要變量本身就得到了該變量的全部信息,不需要其它內(nèi)容,是直接的。其實(shí)程序在經(jīng)過(guò)編譯以后已經(jīng)將變量名轉(zhuǎn)換為變量的地址,對(duì)變量值的存取都是通過(guò)地址進(jìn)行的。89.1地址和指針的概念1、直接訪問(wèn) 通過(guò)變量本9.1地址和指針的概念2、間接訪問(wèn) 通過(guò)指針變量實(shí)現(xiàn)對(duì)變量的訪問(wèn)方式,稱為間接訪問(wèn)。 首先要定義一個(gè)指針變量,然后將一個(gè)同類型變量的地址賦給該指針變量(這時(shí)我們稱指針變量指向該變量),這樣就可以進(jìn)行間接訪問(wèn)了。 間接訪問(wèn)的過(guò)程是:由指針變量得到變量的地址,根據(jù)該地址找到變量的存儲(chǔ)區(qū),再對(duì)該存儲(chǔ)區(qū)的內(nèi)容進(jìn)行
5、存取,從而實(shí)現(xiàn)了對(duì)變量的間接訪問(wèn)。99.1地址和指針的概念2、間接訪問(wèn) 通過(guò)指針變9.1地址和指針的概念四、指針與指針變量1、指針:簡(jiǎn)單地說(shuō),指針就是地址。二者是同一個(gè)概念的兩種說(shuō)法。只不過(guò)指針更形象一些,就像一個(gè)針一樣,可以指向某個(gè)地方。2、指針變量:專門存放變量地址的變量。首先指針變量就是一個(gè)變量,和我們以前所講的其它變量沒(méi)有本質(zhì)區(qū)別。不同之處在于這種變量中所存放的內(nèi)容是地址。109.1地址和指針的概念四、指針與指針變量1、指針:簡(jiǎn)單地說(shuō),9.1地址和指針的概念指針與指針變量關(guān)系指針變量變量變量地址(指針)變量值指向地址存入指針變量119.1地址和指針的概念指針與指針變量關(guān)系指針變量變量變
6、量地址變量的指針就是變量的地址,存放變量地址的變量是指針變量,用來(lái)指向另一個(gè)變量。為了表示指針變量和它所指向的變量之間的關(guān)系,在程序中用*符號(hào)來(lái)表示“指向”指針變量不同于其他類型的變量,它專門用來(lái)存放地址,必須將它定義為”指針類型“9.2 變量的指針和指向變量的指針變量12變量的指針就是變量的地址,存放變量地址的變量是指針變量,用來(lái)9.2 變量的指針和指向變量的指針變量一、指針變量的定義和賦值1、格式:類型名 * 指針變量名;2、舉例 int *p1; char *s1, *s2; float *a1, *a2, *f;3、說(shuō)明 a. 類型名:指針變量所指向的變量類型。 b. * 是定義指針變
7、量的標(biāo)志,不可丟掉。 c. 指針變量定義后,其值是不確定的,可以通過(guò)賦值語(yǔ)句使一個(gè)指針變量指向一個(gè)整型變量139.2 變量的指針和指向變量的指針變量一、指針變量的定義和為什么要指定類型名如果指針指向的是一個(gè)整型變量,那么指針加1就意味著地址值兩個(gè)字節(jié),如果是指向一個(gè)實(shí)型變量,則增加的應(yīng)該是4個(gè)字節(jié),所以一個(gè)指針變量只能指向同一個(gè)類型的變量14為什么要指定類型名149.2 變量的指針和指向變量的指針變量4、賦值:可以進(jìn)行初始化,也可以使用賦值語(yǔ)句(1)、初始化: int a, *s=&a;(2)、賦值語(yǔ)句 int a, *s; s=&a;(3)、注意:只能用同類型變量的地址進(jìn)行賦值! 如定義:i
8、nt *s; float f; 則 s=&f;是非法的。159.2 變量的指針和指向變量的指針變量4、賦值:可以進(jìn)行初不定9.2 變量的指針和指向變量的指針變量在分析有關(guān)指針的程序時(shí),畫(huà)圖是很好的方法:sa若有: int a=5, *s=&a; 則不定5&a16不定9.2 變量的指針和指向變量的指針變量在分析有關(guān)指針的9.2 變量的指針和指向變量的指針變量二、指針變量的引用1、兩個(gè)運(yùn)算符:& 與 * &:取地址運(yùn)算符,注意與作位運(yùn)算符時(shí)的不同(雙目) *:取內(nèi)容 ,指針運(yùn)算符。注意與作乘運(yùn)算符時(shí)的不同(雙目)2、說(shuō)明 a. &既可作用于一般變量,也可作用于指針變量 b. * 只能作用于指針變量
9、 c. 定義指針變量時(shí)的 * 與該處的含義不同179.2 變量的指針和指向變量的指針變量二、指針變量的引用19.2 變量的指針和指向變量的指針變量main() int a,b; int *pointer_1, *pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf(%d,%dn,a,b); printf(%d,%dn,*pointer_1, *pointer_2); 189.2 變量的指針和指向變量的指針變量main()189.2 變量的指針和指向變量的指針變量如果有pointer_1=&a;(1)&*pointer_1 結(jié)果是變量
10、a的地址,*pointer_1相當(dāng)于變量a(2)pointer_2=&*pointer_1; 結(jié)果pointer_2指向變量a&和*兩個(gè)運(yùn)算符的優(yōu)先級(jí)相同,按自右而左方向結(jié)合(3)*&a 等價(jià)于變量a(4)(*pointer_1)+ 相當(dāng)于a+199.2 變量的指針和指向變量的指針變量如果有pointer9.2 變量的指針和指向變量的指針變量3、指針變量可以進(jìn)行的操作(1)賦值:int a,*p1=&a,*p2; p2=p1;(2)輸出:printf(“%x”,p1);(3)增減:p1+; p2-; p1+=4; (4)取內(nèi)容:*p1=5; a=5; printf(“%d”,*p1);(5)比
11、較:與指針常量NULL進(jìn)行比較,兩指針變量 值的大小比較無(wú)意義。表示空指針,即不指向任何單元,在頭文件stdio.h中定義。define NULL 0209.2 變量的指針和指向變量的指針變量3、指針變量可以進(jìn)行9.2 變量的指針和指向變量的指針變量例9.1 #include main( ) int a1=11, a2=22; int *p1, *p2; p1=&a1; p2=&a2; printf(“%d,%dn”,*p1,*p2); p2=p1; printf(“%d,%dn”,*p1,*p2); p1&a11122a1p2a2&a2*p1*p2&a1219.2 變量的指針和指向變量的指針
12、變量例9.1 #i9.2 變量的指針和指向變量的指針變量 例9.2 #include main( ) int a1=11,a2=22; int *p1,*p2,*p; p1=&a1; p2=&a2; printf(“%d,%dn”,*p1,*p2); p=p1; p1=p2; p2=p; printf(“%d,%dn”,*p1,*p2); p1&a11122a1p2a2&a2*p1*p2&a1&a2229.2 變量的指針和指向變量的指針變量 例9.2 9.2 變量的指針和指向變量的指針變量例9.3 #include main( ) int a1=11,a2=22,t; int *p1,*p2;
13、 p1=&a1; p2=&a2; printf(“%d,%dn”,a1,a2); t=*p1; *p1=*p2; *p2=t; printf(“%d,%dn”,a1,a2); p1&a11122a1p2a2&a2*p1*p22211t 11239.2 變量的指針和指向變量的指針變量例9.3 9.2 變量的指針和指向變量的指針變量例9.4 #include main( ) int a1=3; int *p1; p1=&a1; printf(“%xn”,p1); p1+; printf(“%xn”,p1); a10000001100000000ffccffcdffceffcfp1p1+249.2
14、變量的指針和指向變量的指針變量例9.4 9.2 變量的指針和指向變量的指針變量三、指針變量作為函數(shù)的參數(shù)1、定義形式:只需要形式參數(shù)名前加上一個(gè)*即可,作用是將變量的地址傳遞到另一個(gè)函數(shù)中 如:void test(int *pointer, char f, char *s)2、說(shuō)明 參數(shù)的傳遞是值傳遞,單向的(從實(shí)參到形參)。那么如何理解通過(guò)指針作為參數(shù)可以改變主調(diào)函數(shù)中變量的值呢? 形參得到實(shí)參的值(一個(gè)地址),函數(shù)中可以通過(guò)形參引用該地址,從而可以改變?cè)摰刂穼?duì)應(yīng)變量的值。但如果形參本身改變了,其值不會(huì)傳給實(shí)參。259.2 變量的指針和指向變量的指針變量三、指針變量作為函數(shù)9.2 變量的指針
15、和指向變量的指針變量main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(n%d,%dn,a,b); swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;運(yùn)行結(jié)果;5,99,5269.2 變量的指針和指向變量的指針變量main()swap27279.2 變量的指針和指向變量的指針變量swap(int *p1,int *p
16、2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp;因?yàn)?temp所指向的單元是不可預(yù)見(jiàn)的,因此對(duì)*temp賦值可能會(huì)破壞系統(tǒng)的正常工作狀況,應(yīng)該將*p1的值賦給一個(gè)整型變量289.2 變量的指針和指向變量的指針變量swap(int *swap(int *p1,int *p2)int *p; p=p1; p1=p2; p2=p;main() 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
17、er_2); printf(n%d,%dn,*pointer_1,*pointer_2); 29swap(int *p1,int *p2)2930309.3 指針與數(shù)組 在語(yǔ)言中,指針與數(shù)組有著密切的關(guān)系。對(duì)數(shù)組元素,既可以采用數(shù)組下標(biāo)來(lái)引用,也可以通過(guò)指向數(shù)組元素的指針來(lái)引用。采用指針?lè)椒ㄌ幚頂?shù)組,可以產(chǎn)生代碼長(zhǎng)度小、運(yùn)行速度快的程序。319.3 指針與數(shù)組 在語(yǔ)言中,指針與數(shù)組有9.3 指針與數(shù)組一、指向數(shù)組元素的指針設(shè)有數(shù)組定義為:int a5; 則有:(1) a表示數(shù)組在內(nèi)存中的首地址,也就是數(shù)組中第1 個(gè)元素的首地址,它是一個(gè)地址常量,其值由系 統(tǒng)在編譯時(shí)確定,程序運(yùn)行期間不能改變。
18、(2) 數(shù)組中的各元素表示為: a0、a1、a2、a3、a4數(shù)組的指針是數(shù)組的起始地址 a數(shù)組元素的指針是數(shù)組元數(shù)的地址 &a0、&a3329.3 指針與數(shù)組一、指向數(shù)組元素的指針設(shè)有數(shù)組定義為:iint a10;int *p;下面兩個(gè)語(yǔ)句等價(jià):p=&a0;p=a;在定義的時(shí)候也可以賦初值int *p=&a0;33int a10;339.3 指針與數(shù)組二、通過(guò)指針引用數(shù)組元素(1) 數(shù)組中的各元素的地址表示為: &a0、&a1、&a2、&a3、&a4 或者是:a+0(或a)、a+1、a+2、a+3、a+4(2)數(shù)組元數(shù)又可表示成:*(a+0)(或*a)、*(a+1)、 *(a+2)、*(a+3
19、)、*(a+4)(3) 數(shù)組的邏輯結(jié)構(gòu)如下:a0a1a2a3a4a &a0 &a1 &a2 &a3 &a4349.3 指針與數(shù)組二、通過(guò)指針引用數(shù)組元素a0a19.3 指針與數(shù)組現(xiàn)定義一個(gè)指針變量:int *s;并進(jìn)行賦值:s=a; 或 s=&a0;則,指針變量s指向了數(shù)組a的開(kāi)始,二者產(chǎn)生了聯(lián)系,這樣就可以通過(guò)指針變量s訪問(wèn)數(shù)組a了。a0a1a2a3a4a &a0 &a1 &a2 &a3 &a4s注意:a是指針常量,s是指針變量。359.3 指針與數(shù)組現(xiàn)定義一個(gè)指針變量:int *s;a9.3 指針與數(shù)組當(dāng)然,對(duì)s也可以進(jìn)行其它賦值,如:s=a+2; 或 s=&a2;圖變?yōu)椋篴0a1a2a3
20、a4a &a0 &a1 &a2 &a3 &a4s說(shuō)明:若進(jìn)行操作 s=a; s+=2; 效果與上述相同。369.3 指針與數(shù)組當(dāng)然,對(duì)s也可以進(jìn)行其它賦值,如:a0說(shuō)明:p+i和a+i就是ai的地址,他們都是指向a數(shù)組的第i+1個(gè)元素*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素指向數(shù)組的指針變量也可以帶下標(biāo)如: pi和*(p+i)是等價(jià)的37說(shuō)明:379.3 指針與數(shù)組當(dāng)一個(gè)指針變量指向數(shù)組的首地址后,關(guān)系圖為:數(shù)組int a5指向數(shù)組元素的指針int *s指向數(shù)組元素的訪問(wèn)a, &a0, s, &s0a+1, &a1, s+1, &s1a+i, &ai, s+i, &sia0,
21、 *a, s0, *sa1,*(a+1), s1,*(s+1)ai, *(a+i), si, *(s+i)389.3 指針與數(shù)組當(dāng)一個(gè)指針變量指向數(shù)組的首地址后,關(guān)系圖9.3 指針與數(shù)組總結(jié):一維數(shù)組的訪問(wèn)例 用多種方法訪問(wèn)一維數(shù)組各元素#include main( ) int a5=1, 3, 5, 7, 9, i , *p=a; for (i=0;i5;i+) printf(“%d”,ai); for (i=0;i5;i+) printf(“%d”,*(a+i); for (i=0;i5;i+) printf(“%d”,pi); for (i=0;i5;i+) printf(“%d”,*(
22、p+i); for (;pa+5;p+) printf(“%d”,*p); p=a; while (pp*(+p)使p加1,再取*p(*p)+表示p所指向的元素加1。是元素值加1,不是指針值加141要注意指針變量的當(dāng)前值,在使用指針變量指向數(shù)組的時(shí)候,應(yīng)切實(shí)9.3 指針與數(shù)組三、用數(shù)組名作函數(shù)參數(shù)1、函數(shù)的定義形式例如:int func(int array, int n) 函數(shù)體;也可以寫(xiě)為:int func(int *pointer, int n) 函數(shù)體;429.3 指針與數(shù)組三、用數(shù)組名作函數(shù)參數(shù)1、函數(shù)的定義形式9.3 指針與數(shù)組2、函數(shù)的說(shuō)明形式如有函數(shù)定義:int func(int
23、 array, int n) 函數(shù)體;則對(duì)該函數(shù)的說(shuō)明形式可以寫(xiě)為:int func(int array, int n);int func(int *array, int n);439.3 指針與數(shù)組2、函數(shù)的說(shuō)明形式如有函數(shù)定義:int9.3 指針與數(shù)組例 編寫(xiě)在數(shù)組的最后一個(gè)元素中存放其它元素 和的函數(shù)#include void summary(int *p, int n);main() static int a11=1,2,3,4,5,6,7,8,9,9; summary(a,9); printf(“Sum is %dn”,a9);void summary(int *p, int n)
24、int s=0; while (n) s+=*(p+); *p=s;函數(shù)還可寫(xiě)為:void summary(int arr, int n) int i, s=0; for (i=0;in;i+) s+=arri; arrn=s;449.3 指針與數(shù)組例 編寫(xiě)在數(shù)組的最后一個(gè)元素中存放其它例:將數(shù)組中n個(gè)整數(shù)按相反的順序存放45例:將數(shù)組中n個(gè)整數(shù)按相反的順序存放45main()int i,a10=3,7,9,11,0,6,7,5,4,2; printf(“The original array :n”);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);in
25、v(a,10);printf(“The array has been inverted:n”);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);46main()46void inv(int x,int n) /*形參x為數(shù)組名*/int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; temp=xi; xi=xj; xj=temp; 3791106754224576011973mij47void inv(int x,int n) /*形參xvoid inv(int *x,int n) /*形參x為指針變量*/in
26、t *p,temp,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) temp=*i; *i=*j; *j=temp; 37911067542i,xp=x+mj48void inv(int *x,int n) /*形參x 例:從10個(gè)數(shù)中找出其中的最大值和最小值不要求改變數(shù)組元素的值,只是找到最大和最小值,為了能得到兩個(gè)結(jié)果,我們用兩個(gè)全局變量在函數(shù)間傳遞數(shù)據(jù)49 例:從10個(gè)數(shù)中找出其中的最大值和最小值int max,min; main() void max_min_value(int array,int n); int i,numb
27、er10; printf(enter 10 integer number:n); for(i=0;i10;i+) scanf(%d,&numberi); max_min_value(number,10); printf(nmax=%d,min=%dn,max,min); getch(); 5050void max_min_value(int array,int n) int *p,*array_end; array_end=array+n; max=min=*array; for(p=array+1;pmax) max=*p; else if(*pmin) min=*p; 相當(dāng)于*(array
28、+0)或array0arrayp(開(kāi)始)array_end51相當(dāng)于*(array+0)或arrayp(開(kāi)始)arra 函數(shù)max_min_value的形參array可以改為指針變量類型;void max_min_value(int *array,int n)實(shí)參也可以不用數(shù)組名,而用指針變量傳遞地址,形參仍用指針變量52 函數(shù)max_min_value的形參array可int max,min;void max_min_value(int *array,int n) int *p,*array_end; array_end=array+n; max=min=*array; for(p=arra
29、y+1;pmax) max=*p; else if(*pmin) min=*p; 形參為指針變量類型53int max,min;形參為指針變量類型53main() int i,number10,*p; p=number; printf(enter 10 integer numbers:n); for(i=0;i10;i+,p+) scanf(%d,p); printf(the 10 integer numbers:n); for(p=number,i=0;i10;i+,p+) printf(%d,*p); p=number; max_min_value(p,10); printf(nmax=%
30、d,min=%dn,max,min); getch();實(shí)參為指針變量類型54main()實(shí)參為指針變量類型54總結(jié):若一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組元素的值,實(shí)參和形參的表示形式有以下4種情況:55總結(jié):若一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組元素的值,實(shí)參和形第一種情況:形參和實(shí)參都用數(shù)組名:形參和實(shí)參數(shù)組共用同一段內(nèi)存單元main()int a10; f(a,10); f(int x,int n)56第一種情況:形參和實(shí)參都用數(shù)組名:main()f(int x第二種情況:實(shí)參用數(shù)組名,形參用指針變量通過(guò)形參的變化就可以指向?qū)崊?shù)組的任何一個(gè)元素main()int a10; f(a,10)
31、; f(int *x,int n)57第二種情況:實(shí)參用數(shù)組名,形參用指針變量main()f(in第三種情況:實(shí)參形參都用指針變量傳遞指針變量的值,其實(shí)就是數(shù)組的首地址,通過(guò)形參指針的變化指向數(shù)組的任一元素,從而改變數(shù)組的值main()int a10,*p; p=a; f(p,10); f(int *x,int n)58第三種情況:實(shí)參形參都用指針變量main()f(int *第四種情況:實(shí)參為指針變量,形參為數(shù)組名將數(shù)組的首地址傳給形參指針,形參指針指向數(shù)組的首元素main()int a10,*p; p=a; f(p,10); f(int x,int n)59第四種情況:實(shí)參為指針變量,形參
32、為數(shù)組名main()f(in 以上的四種方法,實(shí)質(zhì)上都是地址的傳遞,1和4只是形式上的不同,實(shí)質(zhì)上都是使用的指針變量注意:如果使用指針變量作實(shí)參,必須先使指針變量有確定值,指向一個(gè)已定義的數(shù)組!如果不設(shè)數(shù)組,只設(shè)指針變量,就會(huì)出錯(cuò)。60 以上的四種方法,實(shí)質(zhì)上都是地址的傳遞,1和4只是形式上的不選擇法排序:main() int *p,i,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+; getch(); 61選擇法排序:main()61sort(int
33、x,int 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; 用數(shù)組名作為形參,用下標(biāo)法引用新參數(shù)組元素,62sort(int x,int n)用數(shù)組名作為形參,用下sort(int *x,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;j*(x+k) k=j; if(k!=i) t=*(x+i); *(x+i)=*(x+k); *(x+k)=t; 形參是指針變量63sort(int *x,int n)形參是指針變量63指
34、向二維數(shù)組的指針和指針變量一、多維數(shù)組的地址int a34=1,3,5,7,9,11,13,15,17,19,21,23;a是一個(gè)數(shù)組名,a數(shù)組名包含3行,即三個(gè)元素:a0,a1,a2.而每一個(gè)元素又是一個(gè)一維數(shù)組a0: a00 a01 a02a1: a10 a11 a12a2: a20 a21 a2264指向二維數(shù)組的指針和指針變量一、多維數(shù)組的地址64指向二維數(shù)組的指針和指針變量從二維數(shù)組的角度來(lái)看,a代表整個(gè)二維數(shù)組的地址,也就是0行的首地址,a1代表第1行的首地址,也就是a1的地址a0代表第0行一維數(shù)組第0列元素的地址,即&a00,a1的值是&a10a2的值是&a2065指向二維數(shù)組的
35、指針和指針變量從二維數(shù)組的角度來(lái)看,a代表整個(gè)指向二維數(shù)組的指針和指針變量第0行第1列的元素的地址可以用a0+1來(lái)表示,這里的1代表1個(gè)列元素的字節(jié)數(shù),即兩個(gè)字節(jié)。即&a0166指向二維數(shù)組的指針和指針變量第0行第1列的元素的地址可以用a表示形式含義地址值&a指向二維數(shù)組的指針2000a 二維數(shù)組名,指向a0,第0行首地址2000a0,*(a+0),*aa00的地址2000a+1,&a1第1行首地址2008a1,*(a+1)第1行第0列元素地址2008a1+2,*(a+1)+2,&a12第1行第2列元素的地址2012*(a1+2),*(*(a+1)+2),a12第1行第2列元素的值元素值136
36、7表示形式含義地址值&a指向二維數(shù)組的指針2000a 二維數(shù)組指向二維數(shù)組的指針和指針變量二、指向多維數(shù)組的指針變量(1)指向數(shù)組元素的指針變量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); 68指向二維數(shù)組的指針和指針變量二、指向多維數(shù)組的指針變量mai指向二維數(shù)組的指針和指針變量要輸出某個(gè)指定的數(shù)組元素,a12,則應(yīng)事先計(jì)算該元素在數(shù)組中的相對(duì)位置,計(jì)算aij在數(shù)組中的相對(duì)位置的計(jì)算公式:i*m+j(其
37、中m為二維數(shù)組的列數(shù))如果數(shù)組下標(biāo)從1開(kāi)始的話那么計(jì)算機(jī)公式就改為:(i-1)*m+(j-1)69指向二維數(shù)組的指針和指針變量要輸出某個(gè)指定的數(shù)組元素,a1指向二維數(shù)組的指針和指針變量(2)指向由m個(gè)元素組成的一維數(shù)組的指針變量p指向一個(gè)包含m個(gè)元素的一維數(shù)組,如果p先指向a0即p=&a0,則p+1不是指向a01,而是指向a1,p的增值以一維數(shù)組的長(zhǎng)度為單位70指向二維數(shù)組的指針和指針變量(2)指向由m個(gè)元素組成的一維數(shù)指向二維數(shù)組的指針和指針變量main()int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4,i,j; p=a; scanf(“i
38、=%d,j=%d”,&i,&j); printf(“a%d,%d=%dn”,i,j,*(*(p+i)+j);71指向二維數(shù)組的指針和指針變量main()719.4 指針與字符串 字符串是一種特殊的一維數(shù)組,所以上節(jié)中介紹的方法同樣適用于對(duì)字符串的訪問(wèn)。 字符串的特殊性在于:字符串的末尾是結(jié)束標(biāo)志 0 ,所以訪問(wèn)字符串時(shí)常用結(jié)束標(biāo)志進(jìn)行判斷。729.4 指針與字符串 字符串是一種特殊的一維9.4 指針與字符串一、字符串指針作函數(shù)參數(shù)1、字符串結(jié)構(gòu)的分析設(shè)有數(shù)組定義為:char s=“abcde”; 則s是一個(gè)字符數(shù)組,它里面存放的是一個(gè)字符串。它在內(nèi)存中占用6個(gè)字節(jié),但長(zhǎng)度為5。其結(jié)構(gòu)為:abc
39、de0s s0 s1 s2 s3 s4 s5結(jié)束標(biāo)志739.4 指針與字符串一、字符串指針作函數(shù)參數(shù)1、字符串結(jié)構(gòu)9.4 指針與字符串字符串還可以定義為:char *s=“abcde”; 它在內(nèi)存中占用6個(gè)字節(jié),長(zhǎng)度為5。其結(jié)構(gòu)為:abcde0s s0 s1 s2 s3 s4 s5結(jié)束標(biāo)志749.4 指針與字符串字符串還可以定義為:char *s=說(shuō)明程序在定義字符指針變量的時(shí)候,是把字符串的首地址(即存放字符串的字符數(shù)組的首地址)賦給ss作為一個(gè)指針變量,指向字符型數(shù)據(jù),只能指向一個(gè)字符變量或其他字符類型數(shù)據(jù),不能同時(shí)指向多個(gè)字符數(shù)據(jù)75說(shuō)明程序在定義字符指針變量的時(shí)候,是把字符串的首地址(
40、即存放說(shuō)明char *string;*string=“abc”;就是錯(cuò)誤的, 但可以 string=“abc”; 也可以 char *string=“abc”;輸出時(shí):printf(“%sn”,string);字符指針變量名string,則系統(tǒng)先輸出它所指向的一個(gè)字符數(shù)據(jù),然后自動(dòng)使string加1,使之指向下一個(gè)字符,然后再輸出一個(gè)字符如此直到遇到字符串結(jié)束標(biāo)志n為止對(duì)于字符串種字符的存取,可以用下標(biāo)方法,也可以用指針?lè)椒?6說(shuō)明char *string;76例:例 將字符數(shù)組a中的字符串拷貝到字符數(shù)組b中(1) 下標(biāo)法 (2) 指針?lè)?include #include main() mai
41、n() char a=“Hello,world!”,b20; char a=“Hello,world!”,b20; int i; char *pa,*pb; for (i=0;ai!=0;i+) for (pa=a,pb=b;*pa!=0;pa+,pb+) bi=ai; *(b+i)=*(a+i); *pb=*pa; bi=0; *(b+i)=0; *pb=0; printf(“%sn”,b); printf(“%sn”,b); 77例:例 將字符數(shù)組a中的字符串拷貝到字符數(shù)組b中779.4 指針與字符串二、字符串指針作函數(shù)參數(shù)1、函數(shù)的定義形式例如:char func(char a, cha
42、r b) 函數(shù)體;也可以寫(xiě)為:char func(char *a, char *b) 函數(shù)體;789.4 指針與字符串二、字符串指針作函數(shù)參數(shù)1、函數(shù)的定義例:設(shè)計(jì)一函數(shù),實(shí)現(xiàn)與標(biāo)準(zhǔn)函數(shù)strcpy類似的功能。#include void mystrcpy(char *to, char *from);main( ) char ca20, *cp=“Hello,world!”; mystrcpy(ca,cp); printf(“%s”,ca);void mystrcpy(char *to, char *from) while (*from!=0) *to=*from; to+; from+; *t
43、o=0;79例:設(shè)計(jì)一函數(shù),實(shí)現(xiàn)與標(biāo)準(zhǔn)函數(shù)strcpy類似的功能。#iwhile(*from!=0) *to=*from; to+; from+; while(*to=*from)!=0)to+; from+while(*to+=*from+)!=0)while(*from!=0)*to+=*from+;while(*from)*to+=*from+;while(*to+=*from+)for(;(*to+=*from+)!=0;)80while(*from!=0)while(*to=*也可以用指針變量(局部變量)void copy_string(char from,char to) char
44、 *p1,*p2; p1=from;p2=to; while(*p2+=*p1+)!=0);81也可以用指針變量(局部變量)81總結(jié):實(shí)參形參數(shù)組名數(shù)組名數(shù)組名字符指針變量字符指針變量字符指針變量字符指針變量數(shù)組名82總結(jié):實(shí)參形參數(shù)組名數(shù)組名數(shù)組名字符指針變量字符指針變量字符9.4 字符指針變量和字符數(shù)組字符數(shù)組由若干個(gè)元素組成,每個(gè)元素種放一個(gè)字符,而字符指針變量中存放的是地址(字符串的首地址),決不是將字符串放到字符指針變量中839.4 字符指針變量和字符數(shù)組字符數(shù)組由若干個(gè)元素組成,每賦值方式對(duì)字符數(shù)組只能對(duì)各個(gè)元素賦值如:char str14; string=“I love Chin
45、a!”;是錯(cuò)誤的而對(duì)字符指針變量,可以采用以下方法如:char *a; a=“I love China!”;84賦值方式對(duì)字符數(shù)組只能對(duì)各個(gè)元素賦值84對(duì)字符指針變量賦初值char *a=“I love China!”;等價(jià)于:char *a;a=“I love China!”;對(duì)數(shù)組的初始化char str14=“I love China!”;不能等價(jià)于:char str14;str=“I love China!”;即數(shù)組可以在定義時(shí)整體賦初值,但不能在賦值語(yǔ)句中整體賦值85對(duì)字符指針變量賦初值char *a=“I love Chin定義的字符數(shù)組,在編譯時(shí)為它分配內(nèi)存單元,它有確定的地址。
46、定義指針變量時(shí),給指針變量分配內(nèi)存單元,放一個(gè)地址值,該指針變量就指向一個(gè)字符型數(shù)據(jù),char str10;scanf(“%s”,str);是可以的char *a;scanf(“%s”,a);不建議這樣做char *a,str10;a=str;scanf(“%s”,a);86定義的字符數(shù)組,在編譯時(shí)為它分配內(nèi)存單元,它有確定的地址。cmain()char *a=“I love China!”; a=a+7; printf(“%s”,a);指針變量的值是可以改變的char str=“I love China!”;str=str+7;printf(“%s”,str);是錯(cuò)誤的!數(shù)組名雖然代表地址,
47、但是它的值是不能改變的87main()char str=“I love Chin用指針變量指向一個(gè)格式字符串用指針變量指向一個(gè)格式字符串,用它代替printf函數(shù)中的格式字符串。char *format;format=“a=%d,b=%fn”;printf(format,a,b);相當(dāng)于:printf(“a=%d,b=%fn”,a,b);也可以用字符數(shù)組來(lái)實(shí)現(xiàn):char format=“a=%d,b=%fn”;printf(format,a,b);但由于不能采用賦值語(yǔ)句對(duì)數(shù)組整體賦值:char format;format=“a=%d,b=%dn”;是錯(cuò)誤的88用指針變量指向一個(gè)格式字符串用指針
48、變量指向一個(gè)格式字符串,用9.5函數(shù)的指針和指向函數(shù)的指針變量一個(gè)函數(shù)在編譯時(shí)被分配給一個(gè)入口地址,這個(gè)入口地址就稱為函數(shù)的指針,可以用一個(gè)指針變量指向函數(shù),然后通過(guò)該指針變量調(diào)用此函數(shù)899.5函數(shù)的指針和指向函數(shù)的指針變量一個(gè)函數(shù)在編譯時(shí)被分配給9.5函數(shù)的指針和指向函數(shù)的指針變量main()int max(int,int); int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“a=%d,b=%d,max=%d”,a,b,c);max(int x,int y)int z; if(xy) z=x; else z=y; return(z);
49、909.5函數(shù)的指針和指向函數(shù)的指針變量main()max(in9.5函數(shù)的指針和指向函數(shù)的指針變量每一個(gè)函數(shù)都有一個(gè)起始地址,可以用指針變量指向一個(gè)函數(shù),通過(guò)指針變量來(lái)訪問(wèn)它所指向的函數(shù)main()int max(int,int); int (*p)(); int a,b,c; p=max; scanf(“%d,%d”,&a,&b); c=(*p)(a,b); printf(“a=%d,b=%d,max=%d”,a,b,c);將函數(shù)max的入口地址賦給指針變量p調(diào)用函數(shù)max919.5函數(shù)的指針和指向函數(shù)的指針變量每一個(gè)函數(shù)都有一個(gè)起始地9.5函數(shù)的指針和指向函數(shù)的指針變量int (*p)(
50、)定義p是一個(gè)指向函數(shù)的指針變量,此函數(shù)帶回整型的返回值。注意:*p兩側(cè)的括弧不可省略,表示p先與*結(jié)合,是指針變量,然后再與后面的()結(jié)合,表示此指針變量指向函數(shù)929.5函數(shù)的指針和指向函數(shù)的指針變量int (*p)()定義9.5函數(shù)的指針和指向函數(shù)的指針變量說(shuō)明:指向函數(shù)的指針變量的一般定義為:數(shù)據(jù)類型 (*指針變量名)();函數(shù)的調(diào)用可以通過(guò)函數(shù)名調(diào)用,也可以通過(guò)函數(shù)指針調(diào)用(即用指向函數(shù)的指針變量調(diào)用)(*p)()表示定義了個(gè)指向函數(shù)的指針變量,它不固定指向某個(gè)函數(shù),在一個(gè)程序中,一個(gè)指針變量可以先后指向不同的函數(shù)939.5函數(shù)的指針和指向函數(shù)的指針變量說(shuō)明:939.5函數(shù)的指針和指
51、向函數(shù)的指針變量在給函數(shù)指針變量賦值時(shí),只需給出函數(shù)名而不必給出參數(shù):因?yàn)槭菍⒑瘮?shù)的入口地址賦給指針變量,而不牽涉到實(shí)參和形參的結(jié)合問(wèn)題用函數(shù)指針調(diào)用函數(shù),只需將(*p)代替函數(shù)名即可,在(*p)后的括弧中根據(jù)需要寫(xiě)上實(shí)參。c=(*p)(a,b);對(duì)指向函數(shù)的指針變量,p+n,p+,p-,是無(wú)意義的949.5函數(shù)的指針和指向函數(shù)的指針變量在給函數(shù)指針變量賦值時(shí),9.6 返回指針值的函數(shù)1、概念 當(dāng)函數(shù)的返回值是指針類型(地址)時(shí),則稱為指針函數(shù)。2、定義類型名 *函數(shù)名(形參表)如:int *f(int a); 等等。959.6 返回指針值的函數(shù)1、概念 當(dāng)函數(shù)的返回值是指例 將一個(gè)字符串轉(zhuǎn)換為大寫(xiě)形式并輸出char *mytoupper(char *s) char *t=s; while (*t!=0) *t=(*t=a & *t=z)? *t32 : *t; t+; return(s);main( ) char ps80, *s; gets(ps); s=mytoupper(ps); puts
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動(dòng)合同法在企業(yè)的實(shí)施調(diào)查報(bào)告(2025年版)
- 2025年股權(quán)轉(zhuǎn)讓框架協(xié)議
- 2025年離婚協(xié)議書(shū)兩個(gè)小孩模板
- 【單元重點(diǎn)難點(diǎn)】譯林版(三起)英語(yǔ)三年級(jí)上冊(cè)Unit-7-單元復(fù)習(xí)(知識(shí)梳理檢測(cè))-(含解析)
- 2025年河北省邢臺(tái)市單招職業(yè)適應(yīng)性測(cè)試題庫(kù)學(xué)生專用
- 2024年運(yùn)載火箭遙測(cè)系統(tǒng)檢測(cè)設(shè)備項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 第九章 第2節(jié) 液體的壓強(qiáng)(教學(xué)設(shè)計(jì))2024-2025學(xué)年人教版(2024)物理八年級(jí)下冊(cè)
- 2025年??谑袉握新殬I(yè)傾向性測(cè)試題庫(kù)參考答案
- 2025年廣東省外語(yǔ)藝術(shù)職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)一套
- 《小數(shù)除法-誰(shuí)打電話時(shí)間長(zhǎng)》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)北師大版
- 初三九年級(jí)下冊(cè)部編人教版歷史考試必背資料(2020最新版)
- 觀賞樹(shù)木的園林特性課件
- 當(dāng)代教育心理學(xué)(范圍)課件
- 法院卷宗范本
- XX化工有限責(zé)任公司維保方案
- 冷作工工藝與技能訓(xùn)練(第三版)教學(xué)課件匯總整本書(shū)電子教案全套教學(xué)教程完整版電子教案(最新)
- 部編版六年級(jí)下冊(cè)語(yǔ)文課堂作業(yè)本答案
- 圖解2022年新制訂全面推進(jìn)“大思政課”建設(shè)的工作方案學(xué)習(xí)解讀《全面推進(jìn)“大思政課”建設(shè)的工作方案》課件
- 家譜樹(shù)形圖模板
- 文苑小學(xué)安全管理網(wǎng)絡(luò)圖0
- 2 遺傳圖繪制
評(píng)論
0/150
提交評(píng)論