c語言(第九章)指針講義課件_第1頁
c語言(第九章)指針講義課件_第2頁
c語言(第九章)指針講義課件_第3頁
c語言(第九章)指針講義課件_第4頁
c語言(第九章)指針講義課件_第5頁
已閱讀5頁,還剩99頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第 九 章指 針1第 九 章指 針19.1 地址和指針的概念 指針是C語言的一個重要概念,也是C語言的一個重要特色。深刻理解和正確使用指針是學(xué)習(xí)本章的基本要求。 本章是一個難點,也是一個重點,初學(xué)者不易掌握。在理解和熟悉基本內(nèi)容的前提下,上機實驗是必不可少的環(huán)節(jié)。29.1 地址和指針的概念 指針是C語言的一個9.1 地址和指針的概念正確靈活的運用指針可以有效表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)能動態(tài)分配內(nèi)存方便使用字符串方便有效的使用數(shù)組調(diào)用函數(shù)時可以得到多個值能直接處理內(nèi)存地址39.1 地址和指針的概念正確靈活的運用指針39.1 地址和指針的概念數(shù)據(jù)在內(nèi)存中是如何存取的?例:在程序中定義了一個變量,在編譯時給

2、這個變量分配內(nèi)存單元,根據(jù)定義的變量類型,分配一定長度空間內(nèi)存中的每一個字節(jié)有一個編號,這就是地址,在地址所標(biāo)志的內(nèi)存單元中存放數(shù)據(jù)49.1 地址和指針的概念數(shù)據(jù)在內(nèi)存中是如何存取的?49.1 地址和指針的概念一、地址 在計算機中,把內(nèi)存區(qū)劃分為一個一個的存儲單元,每個單元為一個字節(jié)(位),它們都有一個編號,這個編號就是內(nèi)存地址。如下圖所示:注意:1、程序中定義的每個數(shù)據(jù)在編譯后都占有各自的內(nèi)存區(qū)。2、數(shù)據(jù)所占有的存儲單元個數(shù)是由其類型決定的。3、首地址:第1個單元的地址4、表示地址的數(shù)與整數(shù)的區(qū)別59.1 地址和指針的概念一、地址 在計算機中9.1 地址和指針的概念二、舉例 如有定義:cha

3、r c=A; int a=3; 則所占內(nèi)存情況如下:注意:c和a的地址可能相鄰,也可能不相鄰,是由系統(tǒng)分配的,我們不用關(guān)心。69.1 地址和指針的概念二、舉例 如有定義:char 9.1地址和指針的概念三、直接訪問和間接訪問 有兩個上鎖且放著物品的盒子A、B, 如果你有A盒子的鑰匙,則可以直接打開A盒子將物品取出; 如果你有B盒子的鑰匙,而A盒子的鑰匙在B盒子中,要想取出A盒子中的物品,則必須先打開B盒子,取出A盒子的鑰匙,再打開A盒子將物品取出。 上面兩種情況就是直接訪問和間接訪問的概念。79.1地址和指針的概念三、直接訪問和間接訪問 9.1地址和指針的概念1、直接訪問 通過變量本身對變量進

4、行存取的方式,稱為直接訪問。 如定義:int x; 則x=9; x+=5; 等等 這種訪問方式只需要變量本身就得到了該變量的全部信息,不需要其它內(nèi)容,是直接的。其實程序在經(jīng)過編譯以后已經(jīng)將變量名轉(zhuǎn)換為變量的地址,對變量值的存取都是通過地址進行的。89.1地址和指針的概念1、直接訪問 通過變量本9.1地址和指針的概念2、間接訪問 通過指針變量實現(xiàn)對變量的訪問方式,稱為間接訪問。 首先要定義一個指針變量,然后將一個同類型變量的地址賦給該指針變量(這時我們稱指針變量指向該變量),這樣就可以進行間接訪問了。 間接訪問的過程是:由指針變量得到變量的地址,根據(jù)該地址找到變量的存儲區(qū),再對該存儲區(qū)的內(nèi)容進行

5、存取,從而實現(xiàn)了對變量的間接訪問。99.1地址和指針的概念2、間接訪問 通過指針變9.1地址和指針的概念四、指針與指針變量1、指針:簡單地說,指針就是地址。二者是同一個概念的兩種說法。只不過指針更形象一些,就像一個針一樣,可以指向某個地方。2、指針變量:專門存放變量地址的變量。首先指針變量就是一個變量,和我們以前所講的其它變量沒有本質(zhì)區(qū)別。不同之處在于這種變量中所存放的內(nèi)容是地址。109.1地址和指針的概念四、指針與指針變量1、指針:簡單地說,9.1地址和指針的概念指針與指針變量關(guān)系指針變量變量變量地址(指針)變量值指向地址存入指針變量119.1地址和指針的概念指針與指針變量關(guān)系指針變量變量變

6、量地址變量的指針就是變量的地址,存放變量地址的變量是指針變量,用來指向另一個變量。為了表示指針變量和它所指向的變量之間的關(guān)系,在程序中用*符號來表示“指向”指針變量不同于其他類型的變量,它專門用來存放地址,必須將它定義為”指針類型“9.2 變量的指針和指向變量的指針變量12變量的指針就是變量的地址,存放變量地址的變量是指針變量,用來9.2 變量的指針和指向變量的指針變量一、指針變量的定義和賦值1、格式:類型名 * 指針變量名;2、舉例 int *p1; char *s1, *s2; float *a1, *a2, *f;3、說明 a. 類型名:指針變量所指向的變量類型。 b. * 是定義指針變

7、量的標(biāo)志,不可丟掉。 c. 指針變量定義后,其值是不確定的,可以通過賦值語句使一個指針變量指向一個整型變量139.2 變量的指針和指向變量的指針變量一、指針變量的定義和為什么要指定類型名如果指針指向的是一個整型變量,那么指針加1就意味著地址值兩個字節(jié),如果是指向一個實型變量,則增加的應(yīng)該是4個字節(jié),所以一個指針變量只能指向同一個類型的變量14為什么要指定類型名149.2 變量的指針和指向變量的指針變量4、賦值:可以進行初始化,也可以使用賦值語句(1)、初始化: int a, *s=&a;(2)、賦值語句 int a, *s; s=&a;(3)、注意:只能用同類型變量的地址進行賦值! 如定義:i

8、nt *s; float f; 則 s=&f;是非法的。159.2 變量的指針和指向變量的指針變量4、賦值:可以進行初不定9.2 變量的指針和指向變量的指針變量在分析有關(guān)指針的程序時,畫圖是很好的方法:sa若有: int a=5, *s=&a; 則不定5&a16不定9.2 變量的指針和指向變量的指針變量在分析有關(guān)指針的9.2 變量的指針和指向變量的指針變量二、指針變量的引用1、兩個運算符:& 與 * &:取地址運算符,注意與作位運算符時的不同(雙目) *:取內(nèi)容 ,指針運算符。注意與作乘運算符時的不同(雙目)2、說明 a. &既可作用于一般變量,也可作用于指針變量 b. * 只能作用于指針變量

9、 c. 定義指針變量時的 * 與該處的含義不同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&和*兩個運算符的優(yōu)先級相同,按自右而左方向結(jié)合(3)*&a 等價于變量a(4)(*pointer_1)+ 相當(dāng)于a+199.2 變量的指針和指向變量的指針變量如果有pointer9.2 變量的指針和指向變量的指針變量3、指針變量可以進行的操作(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進行比較,兩指針變量 值的大小比較無意義。表示空指針,即不指向任何單元,在頭文件stdio.h中定義。define NULL 0209.2 變量的指針和指向變量的指針變量3、指針變量可以進行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ù)名前加上一個*即可,作用是將變量的地址傳遞到另一個函數(shù)中 如:void test(int *pointer, char f, char *s)2、說明 參數(shù)的傳遞是值傳遞,單向的(從實參到形參)。那么如何理解通過指針作為參數(shù)可以改變主調(diào)函數(shù)中變量的值呢? 形參得到實參的值(一個地址),函數(shù)中可以通過形參引用該地址,從而可以改變該地址對應(yīng)變量的值。但如果形參本身改變了,其值不會傳給實參。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;運行結(jié)果;5,99,5269.2 變量的指針和指向變量的指針變量main()swap27279.2 變量的指針和指向變量的指針變量swap(int *p1,int *p

16、2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp;因為*temp所指向的單元是不可預(yù)見的,因此對*temp賦值可能會破壞系統(tǒng)的正常工作狀況,應(yīng)該將*p1的值賦給一個整型變量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ù)組 在語言中,指針與數(shù)組有著密切的關(guān)系。對數(shù)組元素,既可以采用數(shù)組下標(biāo)來引用,也可以通過指向數(shù)組元素的指針來引用。采用指針方法處理數(shù)組,可以產(chǎn)生代碼長度小、運行速度快的程序。319.3 指針與數(shù)組 在語言中,指針與數(shù)組有9.3 指針與數(shù)組一、指向數(shù)組元素的指針設(shè)有數(shù)組定義為:int a5; 則有:(1) a表示數(shù)組在內(nèi)存中的首地址,也就是數(shù)組中第1 個元素的首地址,它是一個地址常量,其值由系 統(tǒng)在編譯時確定,程序運行期間不能改變。

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;下面兩個語句等價:p=&a0;p=a;在定義的時候也可以賦初值int *p=&a0;33int a10;339.3 指針與數(shù)組二、通過指針引用數(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ù)組二、通過指針引用數(shù)組元素a0a19.3 指針與數(shù)組現(xiàn)定義一個指針變量:int *s;并進行賦值:s=a; 或 s=&a0;則,指針變量s指向了數(shù)組a的開始,二者產(chǎn)生了聯(lián)系,這樣就可以通過指針變量s訪問數(shù)組a了。a0a1a2a3a4a &a0 &a1 &a2 &a3 &a4s注意:a是指針常量,s是指針變量。359.3 指針與數(shù)組現(xiàn)定義一個指針變量:int *s;a9.3 指針與數(shù)組當(dāng)然,對s也可以進行其它賦值,如:s=a+2; 或 s=&a2;圖變?yōu)椋篴0a1a2a3

20、a4a &a0 &a1 &a2 &a3 &a4s說明:若進行操作 s=a; s+=2; 效果與上述相同。369.3 指針與數(shù)組當(dāng)然,對s也可以進行其它賦值,如:a0說明:p+i和a+i就是ai的地址,他們都是指向a數(shù)組的第i+1個元素*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素指向數(shù)組的指針變量也可以帶下標(biāo)如: pi和*(p+i)是等價的37說明:379.3 指針與數(shù)組當(dāng)一個指針變量指向數(shù)組的首地址后,關(guān)系圖為:數(shù)組int a5指向數(shù)組元素的指針int *s指向數(shù)組元素的訪問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)一個指針變量指向數(shù)組的首地址后,關(guān)系圖9.3 指針與數(shù)組總結(jié):一維數(shù)組的訪問例 用多種方法訪問一維數(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ù)組的時候,應(yīng)切實9.3 指針與數(shù)組三、用數(shù)組名作函數(shù)參數(shù)1、函數(shù)的定義形式例如:int func(int array, int n) 函數(shù)體;也可以寫為:int func(int *pointer, int n) 函數(shù)體;429.3 指針與數(shù)組三、用數(shù)組名作函數(shù)參數(shù)1、函數(shù)的定義形式9.3 指針與數(shù)組2、函數(shù)的說明形式如有函數(shù)定義:int func(int

23、 array, int n) 函數(shù)體;則對該函數(shù)的說明形式可以寫為:int func(int array, int n);int func(int *array, int n);439.3 指針與數(shù)組2、函數(shù)的說明形式如有函數(shù)定義:int9.3 指針與數(shù)組例 編寫在數(shù)組的最后一個元素中存放其它元素 和的函數(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ù)還可寫為:void summary(int arr, int n) int i, s=0; for (i=0;in;i+) s+=arri; arrn=s;449.3 指針與數(shù)組例 編寫在數(shù)組的最后一個元素中存放其它例:將數(shù)組中n個整數(shù)按相反的順序存放45例:將數(shù)組中n個整數(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個數(shù)中找出其中的最大值和最小值不要求改變數(shù)組元素的值,只是找到最大和最小值,為了能得到兩個結(jié)果,我們用兩個全局變量在函數(shù)間傳遞數(shù)據(jù)49 例:從10個數(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(開始)array_end51相當(dāng)于*(array+0)或arrayp(開始)arra 函數(shù)max_min_value的形參array可以改為指針變量類型;void max_min_value(int *array,int n)實參也可以不用數(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();實參為指針變量類型54main()實參為指針變量類型54總結(jié):若一個實參數(shù)組,想在函數(shù)中改變此數(shù)組元素的值,實參和形參的表示形式有以下4種情況:55總結(jié):若一個實參數(shù)組,想在函數(shù)中改變此數(shù)組元素的值,實參和形第一種情況:形參和實參都用數(shù)組名:形參和實參數(shù)組共用同一段內(nèi)存單元main()int a10; f(a,10); f(int x,int n)56第一種情況:形參和實參都用數(shù)組名:main()f(int x第二種情況:實參用數(shù)組名,形參用指針變量通過形參的變化就可以指向?qū)崊?shù)組的任何一個元素main()int a10; f(a,10)

31、; f(int *x,int n)57第二種情況:實參用數(shù)組名,形參用指針變量main()f(in第三種情況:實參形參都用指針變量傳遞指針變量的值,其實就是數(shù)組的首地址,通過形參指針的變化指向數(shù)組的任一元素,從而改變數(shù)組的值main()int a10,*p; p=a; f(p,10); f(int *x,int n)58第三種情況:實參形參都用指針變量main()f(int *第四種情況:實參為指針變量,形參為數(shù)組名將數(shù)組的首地址傳給形參指針,形參指針指向數(shù)組的首元素main()int a10,*p; p=a; f(p,10); f(int x,int n)59第四種情況:實參為指針變量,形參

32、為數(shù)組名main()f(in 以上的四種方法,實質(zhì)上都是地址的傳遞,1和4只是形式上的不同,實質(zhì)上都是使用的指針變量注意:如果使用指針變量作實參,必須先使指針變量有確定值,指向一個已定義的數(shù)組!如果不設(shè)數(shù)組,只設(shè)指針變量,就會出錯。60 以上的四種方法,實質(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是一個數(shù)組名,a數(shù)組名包含3行,即三個元素:a0,a1,a2.而每一個元素又是一個一維數(shù)組a0: a00 a01 a02a1: a10 a11 a12a2: a20 a21 a2264指向二維數(shù)組的指針和指針變量一、多維數(shù)組的地址64指向二維數(shù)組的指針和指針變量從二維數(shù)組的角度來看,a代表整個二維數(shù)組的地址,也就是0行的首地址,a1代表第1行的首地址,也就是a1的地址a0代表第0行一維數(shù)組第0列元素的地址,即&a00,a1的值是&a10a2的值是&a2065指向二維數(shù)組的

35、指針和指針變量從二維數(shù)組的角度來看,a代表整個指向二維數(shù)組的指針和指針變量第0行第1列的元素的地址可以用a0+1來表示,這里的1代表1個列元素的字節(jié)數(shù),即兩個字節(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ù)組的指針和指針變量要輸出某個指定的數(shù)組元素,a12,則應(yīng)事先計算該元素在數(shù)組中的相對位置,計算aij在數(shù)組中的相對位置的計算公式:i*m+j(其

37、中m為二維數(shù)組的列數(shù))如果數(shù)組下標(biāo)從1開始的話那么計算機公式就改為:(i-1)*m+(j-1)69指向二維數(shù)組的指針和指針變量要輸出某個指定的數(shù)組元素,a1指向二維數(shù)組的指針和指針變量(2)指向由m個元素組成的一維數(shù)組的指針變量p指向一個包含m個元素的一維數(shù)組,如果p先指向a0即p=&a0,則p+1不是指向a01,而是指向a1,p的增值以一維數(shù)組的長度為單位70指向二維數(shù)組的指針和指針變量(2)指向由m個元素組成的一維數(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é)中介紹的方法同樣適用于對字符串的訪問。 字符串的特殊性在于:字符串的末尾是結(jié)束標(biāo)志 0 ,所以訪問字符串時常用結(jié)束標(biāo)志進行判斷。729.4 指針與字符串 字符串是一種特殊的一維9.4 指針與字符串一、字符串指針作函數(shù)參數(shù)1、字符串結(jié)構(gòu)的分析設(shè)有數(shù)組定義為:char s=“abcde”; 則s是一個字符數(shù)組,它里面存放的是一個字符串。它在內(nèi)存中占用6個字節(jié),但長度為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個字節(jié),長度為5。其結(jié)構(gòu)為:abcde0s s0 s1 s2 s3 s4 s5結(jié)束標(biāo)志749.4 指針與字符串字符串還可以定義為:char *s=說明程序在定義字符指針變量的時候,是把字符串的首地址(即存放字符串的字符數(shù)組的首地址)賦給ss作為一個指針變量,指向字符型數(shù)據(jù),只能指向一個字符變量或其他字符類型數(shù)據(jù),不能同時指向多個字符數(shù)據(jù)75說明程序在定義字符指針變量的時候,是把字符串的首地址(

40、即存放說明char *string;*string=“abc”;就是錯誤的, 但可以 string=“abc”; 也可以 char *string=“abc”;輸出時:printf(“%sn”,string);字符指針變量名string,則系統(tǒng)先輸出它所指向的一個字符數(shù)據(jù),然后自動使string加1,使之指向下一個字符,然后再輸出一個字符如此直到遇到字符串結(jié)束標(biāo)志n為止對于字符串種字符的存取,可以用下標(biāo)方法,也可以用指針方法76說明char *string;76例:例 將字符數(shù)組a中的字符串拷貝到字符數(shù)組b中(1) 下標(biāo)法 (2) 指針法#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ù)體;也可以寫為:char func(char *a, char *b) 函數(shù)體;789.4 指針與字符串二、字符串指針作函數(shù)參數(shù)1、函數(shù)的定義例:設(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è)計一函數(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ù)組名82總結(jié):實參形參數(shù)組名數(shù)組名數(shù)組名字符指針變量字符指針變量字符9.4 字符指針變量和字符數(shù)組字符數(shù)組由若干個元素組成,每個元素種放一個字符,而字符指針變量中存放的是地址(字符串的首地址),決不是將字符串放到字符指針變量中839.4 字符指針變量和字符數(shù)組字符數(shù)組由若干個元素組成,每賦值方式對字符數(shù)組只能對各個元素賦值如:char str14; string=“I love Chin

45、a!”;是錯誤的而對字符指針變量,可以采用以下方法如:char *a; a=“I love China!”;84賦值方式對字符數(shù)組只能對各個元素賦值84對字符指針變量賦初值char *a=“I love China!”;等價于:char *a;a=“I love China!”;對數(shù)組的初始化char str14=“I love China!”;不能等價于:char str14;str=“I love China!”;即數(shù)組可以在定義時整體賦初值,但不能在賦值語句中整體賦值85對字符指針變量賦初值char *a=“I love Chin定義的字符數(shù)組,在編譯時為它分配內(nèi)存單元,它有確定的地址。

46、定義指針變量時,給指針變量分配內(nèi)存單元,放一個地址值,該指針變量就指向一個字符型數(shù)據(jù),char str10;scanf(“%s”,str);是可以的char *a;scanf(“%s”,a);不建議這樣做char *a,str10;a=str;scanf(“%s”,a);86定義的字符數(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);是錯誤的!數(shù)組名雖然代表地址,

47、但是它的值是不能改變的87main()char str=“I love Chin用指針變量指向一個格式字符串用指針變量指向一個格式字符串,用它代替printf函數(shù)中的格式字符串。char *format;format=“a=%d,b=%fn”;printf(format,a,b);相當(dāng)于:printf(“a=%d,b=%fn”,a,b);也可以用字符數(shù)組來實現(xiàn):char format=“a=%d,b=%fn”;printf(format,a,b);但由于不能采用賦值語句對數(shù)組整體賦值:char format;format=“a=%d,b=%dn”;是錯誤的88用指針變量指向一個格式字符串用指針

48、變量指向一個格式字符串,用9.5函數(shù)的指針和指向函數(shù)的指針變量一個函數(shù)在編譯時被分配給一個入口地址,這個入口地址就稱為函數(shù)的指針,可以用一個指針變量指向函數(shù),然后通過該指針變量調(diào)用此函數(shù)899.5函數(shù)的指針和指向函數(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ù)的指針變量每一個函數(shù)都有一個起始地址,可以用指針變量指向一個函數(shù),通過指針變量來訪問它所指向的函數(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ù)的指針變量每一個函數(shù)都有一個起始地9.5函數(shù)的指針和指向函數(shù)的指針變量int (*p)(

50、)定義p是一個指向函數(shù)的指針變量,此函數(shù)帶回整型的返回值。注意:*p兩側(cè)的括弧不可省略,表示p先與*結(jié)合,是指針變量,然后再與后面的()結(jié)合,表示此指針變量指向函數(shù)929.5函數(shù)的指針和指向函數(shù)的指針變量int (*p)()定義9.5函數(shù)的指針和指向函數(shù)的指針變量說明:指向函數(shù)的指針變量的一般定義為:數(shù)據(jù)類型 (*指針變量名)();函數(shù)的調(diào)用可以通過函數(shù)名調(diào)用,也可以通過函數(shù)指針調(diào)用(即用指向函數(shù)的指針變量調(diào)用)(*p)()表示定義了個指向函數(shù)的指針變量,它不固定指向某個函數(shù),在一個程序中,一個指針變量可以先后指向不同的函數(shù)939.5函數(shù)的指針和指向函數(shù)的指針變量說明:939.5函數(shù)的指針和指

51、向函數(shù)的指針變量在給函數(shù)指針變量賦值時,只需給出函數(shù)名而不必給出參數(shù):因為是將函數(shù)的入口地址賦給指針變量,而不牽涉到實參和形參的結(jié)合問題用函數(shù)指針調(diào)用函數(shù),只需將(*p)代替函數(shù)名即可,在(*p)后的括弧中根據(jù)需要寫上實參。c=(*p)(a,b);對指向函數(shù)的指針變量,p+n,p+,p-,是無意義的949.5函數(shù)的指針和指向函數(shù)的指針變量在給函數(shù)指針變量賦值時,9.6 返回指針值的函數(shù)1、概念 當(dāng)函數(shù)的返回值是指針類型(地址)時,則稱為指針函數(shù)。2、定義類型名 *函數(shù)名(形參表)如:int *f(int a); 等等。959.6 返回指針值的函數(shù)1、概念 當(dāng)函數(shù)的返回值是指例 將一個字符串轉(zhuǎn)換為大寫形式并輸出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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論