c語(yǔ)言程序設(shè)計(jì)10-指針_第1頁(yè)
c語(yǔ)言程序設(shè)計(jì)10-指針_第2頁(yè)
c語(yǔ)言程序設(shè)計(jì)10-指針_第3頁(yè)
c語(yǔ)言程序設(shè)計(jì)10-指針_第4頁(yè)
c語(yǔ)言程序設(shè)計(jì)10-指針_第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、c語(yǔ)言程序設(shè)計(jì)10-指針c語(yǔ)言程序設(shè)計(jì)10-指針 101 指針的概念 簡(jiǎn)單地說(shuō),指針就是地址。 要掌握指針的概念就必須弄清: 內(nèi)存地址概念? 變量與地址的關(guān)系? 如何通過(guò)地址進(jìn)行變量的存取? 101 指針的概念說(shuō)明例: 內(nèi)存用戶數(shù)據(jù) 1000 3 i 1002 6 j 1004 9 k對(duì)變量值的存取總是按地址進(jìn)行的-直接訪問(wèn)。int i,j,k;i=3; j=6;k=i+j;程序經(jīng)編譯后,變量名就不復(fù)存在,以地址對(duì)應(yīng)。說(shuō)明例:int i,j,k;程序經(jīng)編譯后,變量名就不復(fù)存在也可以采用“間接訪問(wèn)”方式: 先將變量i的地址存放到另一變量p1中,要訪問(wèn)i時(shí),先取出p1的內(nèi)容(變量i的地址),再去訪

2、問(wèn)該地址所對(duì)應(yīng)的內(nèi)存單元中的內(nèi)容(變量i的值)。c語(yǔ)言程序設(shè)計(jì)10-指針 內(nèi)存用戶數(shù)據(jù) 1000 3 i 1002 6 j 1004 9 k 2000 1000 p1 2004 1002 p2int i,j,k;i=3; j=6;k=i+j;int *p1, *p2;p1=&i;p2=&j; int 在以上概念的基礎(chǔ)上對(duì)指針下定義: 變量的地址就是該變量的指針。 存放地址的變量稱指針變量。 若p1存放了變量i的地址, 則稱p1是指向變量i的指針變量。10001002100410001002ijkp1p2369int i,j,k;i=3; j=6;k=i+j;int *p1, *p2;p1=&i

3、;p2=&j;10001002100410001002ijkp1p2369 102 變量的指針和指向變量的指針變量 變量的指針 指針變量 指向變量的指針變量 用“*”代表“指向” 如*p1代表它所指向的變量i,同一內(nèi)存單元。 以下兩個(gè)語(yǔ)句等價(jià): i=3; 直接訪問(wèn) *p1=3; 間接訪問(wèn)int i,*p1;p1=&i; 102 變量的指針和指向變量的指針變量 內(nèi)存用戶數(shù)據(jù) 1000 3 i 1002 6 j 1004 9 k 2002 1000 p1 2004 1002 p2int i,j,k;i=3; j=6;k=i+j;int *p1, *p2;p1=&i;p2=&j;*p1=5;*p2=

4、8;58int i,j,k;58 指針變量的定義 指針變量也必須先定義后使用。 int *p1;注意: *表示該變量為指針變量,但變量名是p1。 一個(gè)指針變量只能指向同一類型的變量。 int i,*p1; float a; p1=&i; 合法 p1=&a; 不合法 指針變量的定義 指針變量的引用 兩種用法: 用地址運(yùn)算符& p1=&i; 用指針運(yùn)算符* (實(shí)行間接訪問(wèn)) *p1=100; k=*p1; 注意: 指針變量只能放地址(指針)。 p1=100; 不允許 使用指針運(yùn)算符*之前,p1必須被賦值(即p1必須存放了某個(gè)變量的地址) 指針變量的引用例: T10-1.c 注意:要區(qū)別定義和引用中

5、的“*”main() int a=100,b=10; int *p1,*p2; 定義指針變量,尚無(wú)體指向 p1=&a; p1指向a p2=&b; p2指向b printf(“*p1=%d, *p2=%d n”, *p1, *p2); printf(“&a=%x,& b=%x n”,&a, &b); printf(“p1=%x, p2=%x n”, p1, p2); printf(“& p1=%x, &p2=%x n”, &p1, & p2);運(yùn)算結(jié)果:*p1=100, *p2=10&a=12ff7c,& b=12ff78p1=12ff7c, p2=12ff78&p1=12ff74, &p2=1

6、2ff70例: T10-1.c 注意:要區(qū)別定義和引用中的“*”運(yùn)要特別注意以下用法的后果:egp1.c int *p1; *p1=100;c語(yǔ)言程序設(shè)計(jì)10-指針例:輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出 main() T10-2.c int a,b,*p1, *p2, *p; scanf(“%d,%d”,&a,&b); 1000 5 a p1=&a; p2=&b; 1002 9 b if(ab) p=p1; p1=p2; p2=p; printf(“n %d,%d”,a,b); 2000 p1 printf(“n%d,%d”,*p1,*p2); 2004 p2 2006 p 改變p1和p

7、2的指向10001002100210001000例:輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出 main重要概念: 只要將某一變量的地址存入指針變量中,就可通過(guò)指針變量間接訪問(wèn)該變量。 配鑰匙!c語(yǔ)言程序設(shè)計(jì)10-指針swap(int p1, int p2) int t; t=p1; p1=p2; p2=t; 1000 5 a 1002 9 b main() int a,b; scanf(“%d,%d”,&a,&b); 2000 p1 if(ab)swap(a, b); 2004 p2 printf(“n %d,%d”,a,b); 2006 t T10-3-1.c59595例 不用指針變量作函數(shù)

8、參數(shù),將兩個(gè)整數(shù)按大小順序輸出。怎樣直接修改a、b的值呢?修改原件用指針!swap(int p1, int p2)59595例 指針變量作為函數(shù)的參數(shù) 可將指針變量作函數(shù)的參數(shù),接受實(shí)參地址,獲得具體指向,進(jìn)而通過(guò)指針變量間接訪問(wèn)主調(diào)函數(shù)的變量。 指針變量作為函數(shù)的參數(shù)例T10-3.c用指針變量作函數(shù)參數(shù),將兩個(gè)整數(shù)按大小順序輸出。swap(int *p1, int *p2) int t; t=*p1; *p1=*p2; *p2=t; 1000 5 a 1002 9 b main() int a,b; scanf(“%d,%d”,&a,&b); 2000 p1 if(ab)swap(&a,&b

9、); 2004 p2 printf(“n %d,%d”,a,b); 2006 t 10001002595例T10-3.c用指針變量作函數(shù)參數(shù),將兩個(gè)整數(shù)按大小順序輸 重要概念:使用指針變量作函數(shù)參數(shù),被調(diào)函數(shù)可以將多個(gè)結(jié)果交給主調(diào)函數(shù)。 數(shù)組名做參數(shù),可返回該數(shù)組所有元素 還記得那個(gè)求成績(jī)最高、最低和平均值的例子?還需要用全局變量嗎?c語(yǔ)言程序設(shè)計(jì)10-指針例T10-4-2.c :求n個(gè)數(shù)的最大值、最小值和平均值。float aver(int a, int n, int *max, int *min) int i; float s=0; *max=a0; *min=a0; for(i=0;i*

10、max) *max=ai; if(ai*min) *min=ai; return(s/100);main() int a100,i,max,min;float av;for(i=0;i100;i+) scanf(“%d”,&ai);av=aver(a,100,&max,&min);printf(“ %d,%d,%f”,max,min,av);例T10-4-2.c :求n個(gè)數(shù)的最大值、最小值和平均值。m例T10-4-1.c :編寫(xiě)函數(shù),求一元二次方程的兩個(gè)實(shí)根。#include “math.h” ? root(float a,float b,float c, ) float d; d=b*b-4

11、*a*c; if(d0|a=0)return(0); ? =(-b+sqrt(d)/2/a; ? =(-b-sqrt(d)/2/a; return(1); float *x1, float *x2 *x1 *x2 int main() int k; float a,b,c,x1,x2; scanf(“%f,%f,%f”,&a,&b,&c); k=root(a,b,c,&x1,&x2); if(k) printf(“n %f,%f”,x1,x2); 輸入:1, -10 ,25輸出:5.000000,5.000000函數(shù)參數(shù):如不需改變(只讀):一般參數(shù)如需改變(讀寫(xiě)):指數(shù)參數(shù)例T10-4-1.

12、c :編寫(xiě)函數(shù),求一元二次方程的兩個(gè)實(shí)根。 103 數(shù)組的指針和指向數(shù)組的指針變量數(shù)組有一個(gè)首地址: 數(shù)組的指針。每個(gè)數(shù)組元素也都有地址: 數(shù)組元素的指針。532168742000200220042006 103 數(shù)組的指針和指向數(shù)組的指針變量5321687 指向數(shù)組元素的指針變量 int a10,*p; p=a; 指向數(shù)組 p=&a0; 指向數(shù)組元素 51247680392000200220042006p 指向數(shù)組元素的指針變量51247680392000 通過(guò)指針引用數(shù)組元素 int a10,*p; p=&a0; 或者 p=a; /p指向a0 *p=1; 等效于a0=1; 即可通過(guò)p來(lái)訪問(wèn)

13、a0也可以通過(guò)p來(lái)訪問(wèn)其它元素: *(p+1)=3; 等效于a1=3; 其中p+1指向a1注意:p+1不是地址加1,而是加一個(gè)數(shù)據(jù)類型單位。 通過(guò)指針引用數(shù)組元素一般地,當(dāng)p指向a0時(shí),即p=&a0; 或者 p=a; p+i a+i &ai*(p+i) *(a+i) ai pi即以下幾個(gè)語(yǔ)句等效:ai=10; *(p+i)=10; *(a+i)=10; pi=10;c語(yǔ)言程序設(shè)計(jì)10-指針舉例:用三種方法輸出數(shù)組元素例T10-5-1.c 用“數(shù)組名+下標(biāo)”的方法main()int i, a5;for(i=0; i5; i+) scanf(“%d”,&ai);for(i=0; i5; i+)pr

14、intf(“&a%d=%x, a%d=%d n”, i,&ai, i, ai );輸入: 55 66 77 88 99 輸出: &a0=ffce, a0=55 &a1=ffd0, a1=66 &a2=ffd2, a2=77 &a3=ffd4, a3=88 &a4=ffd6, a4=99 ffcc 55 a0ffce 66 a1ffd0 77 a2ffd2 88 a3ffd4 99 a4ffd6 a5舉例:用三種方法輸出數(shù)組元素輸出:ffcc 舉例:用三種方法輸出數(shù)組元素例T10-5-2.c 計(jì)算“數(shù)組名計(jì)算地址”的方法main() int i, a5; for(i=0;i5;i+) scanf

15、(“%d”,a+i); for(i=0;i5;i+)printf(“a+%d)=%x,*(a+%d)=%d n”,i,(a+i), i,*(a+i);輸出: (a+0)=ffcc, *(a+0)=55 (a+1)=ffce, *(a+1)=66 (a+2)=ffd0, *(a+2)=77 (a+3)=ffd2, *(a+3)=88 (a+4)=ffd4, *(a+4)=99 ffcc 55 a0ffce 66 a1ffd0 77 a2ffd2 88 a3ffd4 99 a4ffd6 a5舉例:用三種方法輸出數(shù)組元素輸出:ffcc 舉例:用三種方法輸出數(shù)組元素例T10-5-3_new.c 用“指

16、針變量+下標(biāo)”的方法(指針?lè)↖ )main()int *p, a5,i; p=a;for(i=0;i5;i+) scanf(“%d”,p+i);for(i=0;i5;i+)printf(&p%d=%x, p%d=%d, *(p+%d)=%dn,i,&pi,i,pi,i,*(p+i);12ff6c 55 p012ff70 66 p112ff74 77 p212ff78 88 p312ff7c 99 p4輸出:&p0=12ff6c, p0=55, *(p+0)=55&p1=12ff70, p1=66, *(p+1)=66&p2=12ff74, p2=77, *(p+2)=77&p3=12ff78,

17、 p3=88, *(p+3)=88&p4=12ff7c, p4=99, *(p+4)=99舉例:用三種方法輸出數(shù)組元素12ff6c 55 舉例:用三種方法輸出數(shù)組元素(例T10-5-4_new.c )用“指針變量指向數(shù)組元素”法(指針?lè)↖I)main()int *p, a5; for(p=a; p (a+5); p+)scanf(“%d”,p+i); for(p=a; p (a+5); p+)printf(“p=%x, *p=%d n”, p,*p);輸出:p=12ff6c,*p=55p=12ff70,*p=66p=12ff74,*p=77p=12ff78,*p=88p=12ff7c,*p=9

18、912ff6c 55 a012ff70 66 a112ff74 77 a212ff78 88 a312ff7c 99 a4p+: 合法, 因p是指針變量,而變量可以用 +運(yùn)算符的a+: 不合法, 因?yàn)閍是數(shù)組名,其值是數(shù)組元素的首地址,分配之后不可變。舉例:用三種方法輸出數(shù)組元素(例T10-5-4_new.c 舉例:用三種方法輸出數(shù)組元素(例T10-5-4.c )指針變量當(dāng)作數(shù)組名使用(混合指針?lè)ǎ?main() int a5,*p=a,i; for(p=a;pa+5;p+) scanf(“%d”,p); p=a;/不能漏! for(i=0;i5;i+) printf(“&p%d=%x,p%d

19、=%d,*(p+%d)=%dn”, i,&pi, i,pi,i,*(p+i); 輸出:&p0=12ff6c,p0=55,*(p+0)=55&p1=12ff70,p1=66,*(p+1)=66&p2=12ff74,p2=77,*(p+2)=77&p3=12ff78,p3=88,*(p+3)=88&p4=12ff7c,p4=99,*(p+4)=9912ff6c 55 p12ff70 66 p+112ff74 77 p+212ff78 88 p+312ff7c 99 p+4舉例:用三種方法輸出數(shù)組元素(例T10-5-4.c )輸出:通過(guò)指針引用數(shù)組元素的方法小結(jié)例:累加求和的各種用法:int *p,

20、a10;s=0;p=a;for(i=0;i10;i+)s+=ai;for(i=0;i10;i+)s+=*(a+i);for(i=0;i10;i+)s+=*(p+i);for(i=0;i10;i+)s+=pi;for(i=0;i10;i+)s+=*p+; for(p=a;pa+10;p+)s+=*p; 最后一種用法效率高。數(shù)組元素地址法指針?lè)↖指針變量指向數(shù)組元素指針?lè)↖I指針變量當(dāng)作數(shù)組名注意不能使用a+通過(guò)指針引用數(shù)組元素的方法小結(jié)數(shù)組元素地址法指針?lè)↖指針?lè)↖指針變量使用時(shí)的幾個(gè)問(wèn)題, 若p當(dāng)前指向a數(shù)組的第i個(gè)元素,則:10-plus.c *p:是取出ai的值. p + :指針指向ai+

21、1. *p+ :等價(jià)于*(p+)及ai+ ,優(yōu)先級(jí)同為2,從右向左結(jié)合,將 ai 的值取出, 后再使 p增1(不是單純的加一,是p指向ai+1). * (+p):與a+i等價(jià),先將p指向ai+1,然后將該元素取出. (*p)+:將p所指的數(shù)組元素ai的值取出,使ai的值增1. p- :指針指向ai-1. *(p-):與ai-等價(jià), 將p 所指向的第i個(gè)數(shù)組元素取出,然后使p指向i-1元素. *(-p):與a- i等價(jià),先將p減1指向第i-1個(gè)元素,然后將其取出. (*p)-:將p所指的數(shù)組元素ai的值取出,使ai的值減1.指針變量使用時(shí)的幾個(gè)問(wèn)題, 數(shù)組名作為函數(shù)參數(shù) 有了指針概念的基礎(chǔ)上,重

22、新回顧數(shù)組名作為函數(shù)參數(shù)時(shí),數(shù)據(jù)的傳遞情況:void sort(int a, int n)void sort(int *a, int n)數(shù)組名作為函數(shù)參數(shù) 例:選擇法排序函數(shù) void sort(int *a, int n)例T10-7-1.c int i,j,t; for(i=0;in-1;i+) for(j=i+1;jaj)t=ai; ai=aj; aj=t; 只將形參改為指針變量,仍按下標(biāo)法使用 void sort(int *a, int n) int i,j,t; for(i=0;in-1;i+) for(j=i+1;j*(a+j) t=*(a+i); *(a+i)= *(a+j);

23、 *(a+j)=t; 按指針?lè)ㄊ褂美齌10-7-2.c 例:選擇法排序函數(shù) void sort(int *a進(jìn)一步優(yōu)化:都用指針,效率更高! (例T10-7-3.c )void sort(int *a, int n) int *i, *j,t; for(i=a;ia+n-1;i+) for(j=i+1;j*j) t=*i; *i=*j; *j=t; main() int a10,j; for(j=0;j10;j+)scanf(“%d”,a+j); sort(a,10); for(j=0;j10;j+)printf(“%5d”,aj); 進(jìn)一步優(yōu)化:都用指針,效率更高! (例T10-7-3.c

24、分段排序?例T10-7-4.c main() int a10,j; for(j=0;j10;j+)scanf(“%d”,a+j); for(j=0;j10;j+)printf(“%5d”,aj); sort(a,5);sort(a+5,5);void sort(int *a, int n) int *i, *j,t; for(i=a;ia+n-1;i+) for(j=i+1;j*j) t=*i; *i=*j; *j=t; 分段排序?例T10-7-4.c sort(a,5);sort 指向多維數(shù)組的指針和指針變量 從本質(zhì)上說(shuō),多維數(shù)組的指針與一維數(shù)組的指針相同,但在概念上和使用上,多維數(shù)組的指針

25、要復(fù)雜些。 以二維數(shù)組的指針為例: 指向多維數(shù)組的指針和指針變量 二維數(shù)組的地址 :一維:a,&ai,a+i 二維:aa+i (行指針:指向第i行)ai *(a+i) (特殊的一維數(shù)組,列指針,指向行中的列)ai+j *(a+i)+j &aij int a34 1357911131517192123100010081016a+0a+1a+2a0討論以下用法的效果:T10-8-1.cfor(i=0;i3;i+) scanf(“%d”,a+i);輸入數(shù)據(jù):1 2 3討論以下用法的效果:T10-8-2.cfor(i=0;i3;i+) scanf(“%d”,a1+i);輸入數(shù)據(jù):1 2 3討論以下用法

26、的效果:T10-8-3.cfor(i=0;i3;i+) scanf(“%d”,a1+i+2);輸入數(shù)據(jù):1 2 3討論以下用法的效果:T10-8-4.cfor(i=0;i3;i+) scanf(“%d”,a+i+1);輸入數(shù)據(jù):1 2 3a0+1a0+2a0+3二維數(shù)組的地址 :int a34 1357911一維數(shù)組與二維數(shù)組的比較第i個(gè)一維數(shù)組的第j個(gè)元素的地址無(wú)意義*(a+i)+j第i個(gè)一維數(shù)組的第j個(gè)元素的值無(wú)意義*(*(a+i)+j)第i個(gè)一維數(shù)組的值第i個(gè)一維數(shù)組的首地址第i個(gè)元素的值*(a+i)第i個(gè)元素 的地址一維數(shù)組第i個(gè)元素的地址a+i二維數(shù)組的首地址一維數(shù)組的首地址a二維數(shù)

27、組一維數(shù)組一維數(shù)組與二維數(shù)組的比較第i個(gè)一維數(shù)組的第j個(gè)元素的地址無(wú)意注意:指針運(yùn)算符*作用在行指針上的結(jié)果仍是指針-列指針; *作用在列指針上的結(jié)果-具體元素。 *(a+0),*(a+1),*(a+2) 仍是地址。*(a+i) ai *(a0),*(a1),*(a1) 具體元素值。*(ai)*(a+i)+j 也是地址,但要區(qū)別: (a+i)+j行指針 (a+1)+1 ? *(a+i)+j列指針 *(a+1)+1 ? 100010081016a+0a+1a+2a0a1a2*(a+1)1357911131517192123注意:100010081016a+0a+1a+2a0a 如果要通過(guò)a+i形

28、式的地址訪問(wèn)數(shù)組元素的具體內(nèi)容,則:*(*(a+i) 或 *(*(a+i)+j)如:*(*(a+1) a10 *(*(a+1)+2) a12討論:例T10-8-5.c*(a+2) *(*(a+1)+3) *(a1+1) *(*(a+1)+5)123456789111012 如果要通過(guò)a+i形式的地址訪問(wèn)數(shù)組元素的具體內(nèi)容,則:1例:求數(shù)組a的所有元素之和。 可有多種用法:例T10-9-1.cT10-9-3.c M行N列for(i=0;iM;i+) for(i=0;iM;i+)for(j=0;jN;j+) for(j=0;jN;j+)s+=aij; s+=*(ai+j);for(i=0;iM;i

29、+)for(j=0;jN;j+) s+=*(*(a+i)+j); aij*(ai+j)*(*(a+i)+j)例:求數(shù)組a的所有元素之和。aij*(ai+j指向二維數(shù)組的指針變量 同樣可使一個(gè)指針變量p指向二維數(shù)組a,再通過(guò)p訪問(wèn)數(shù)組元素。例T10-10.cmain() int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i,k,*p; p=a; k=*p;? k=*(p+2);? for(p=a;pa+2;p+)printf(“%3d,”,*p); ?N列:aij*(p+i*N+j)pi*N+j123456789101112k=p12; 不合法k=*(*(p+1)+

30、2);k=p1*4+2; 合法k=*(p+1*4+2);指向二維數(shù)組的指針變量123456789101112k=p例:求矩陣的上三角元素之和。例T10-11.cmain() int a34,*p,i,j,s=0; 輸入a p=a; for(i=0;i3;i+) for(j=i;j4;j+) s+=pi*4+j; 或 s+=*(p+4*i+j) printf(“n %d”,s); /s=54N列:aij*(p+i*N+j)pi*N+j123456789101112例:求矩陣的上三角元素之和。例T10-11.c1234567 多維數(shù)組的指針作函數(shù)參數(shù) 用于接受實(shí)參數(shù)組地址的形參可用兩種:行指針和列

31、指針。 以方陣轉(zhuǎn)置為例:例T10-13-1.c void at(int (*p)3) 用行指針 int i,j,t; 缺點(diǎn):不通用(必須制定列數(shù)) for(i=0;i3;i+) for(j=i+1;j3;j+) t=pij; pij=pji; pji=t; p指向一個(gè)包含3個(gè)整形元素的一維數(shù)組(行指針),p相當(dāng)于一個(gè)二維數(shù)組! 多維數(shù)組的指針作函數(shù)參數(shù)用列指針:例T10-13-2.c void at(int *p,int n) /n為列數(shù) int i,j,t; for(i=0;in;i+) for(j=i+1;jn;j+) t=pi*n+j; pi*n+j=pj*n+i; pj*n+i=t;

32、優(yōu)點(diǎn):通用 在編通用函數(shù)時(shí),一般使用列指針。用列指針:例T10-13-2.c 用列指針:例T10-13-3.c int sum(int *p,int m,int n) /m行n列 int i,j,s=0; for(i=0;im;i+) for(j=i;jn;j+) s+=pi*n+j; 或 s+=*(p+n*i+j) return(s); 優(yōu)點(diǎn):通用 在編通用函數(shù)時(shí),一般使用列指針。用列指針:例T10-13-3.c 104 字符串的指針和指向字符串的指針變量 字符串的表示形式 可用兩種方法訪問(wèn)字符串: 用字符數(shù)組存放字符串 用字符指針指向一個(gè)字符串104 字符串的指針和指向字符串的指針變量例T

33、10-14.cmain() char str5=”abc”; 定義字符數(shù)組,并將字符串存入 char *p=str; 定義指針變量,指向字符串 printf(“%s”,str); 通過(guò)數(shù)組名訪問(wèn)字符串 printf(“%s”,p); 通過(guò)指針變量訪問(wèn)字符串 printf(“%c”,*(p+2); 通過(guò)指針變量訪問(wèn)字符 strabc0abc010001000p例T10-14.cstrabc0abc010001000 與其它一維數(shù)組的指針相比,字符串的指針有其獨(dú)特之處: 可以通過(guò)指針對(duì)字符串進(jìn)行整體訪問(wèn)。 對(duì)字符串的操作依賴于結(jié)束符。 可以整體賦初值。 有各種字符串處理函數(shù)。 與其它一維數(shù)組的指針

34、相比,字符串的指針有其獨(dú)特之處: 本節(jié)重點(diǎn)掌握: 通過(guò)數(shù)組和通過(guò)指針操作字符串的基本方法。 常用的字符串處理方法。 本節(jié)重點(diǎn)掌握:例:字符串拷貝操作。例T10-15-1.c,例T10-15-2.cmain() char a=”abcdef”,b20; int i; for(i=0; *(a+i)!=0; i+) *(b+i)=*(a+i); *(b+i)=0; printf(“%s”,b);main() char a=”abcdef”,b20,*p1, *p2; p1=a; p2=b; for( ; *p1!=0;p1+,p2+) *p2=*p1; *p2=0; printf(“%s”,b);

35、用指針變量處理例:字符串拷貝操作。例T10-15-1.c,例T10-15-將拷貝操作編成一函數(shù):例T10-15-3.c,例T10-15-4.cvoid copy_string(char *from,char *to) for(; *from; from+,to+) *to=*from; *to=0;還可以改成:void copy_string(char *from,char *to) for(; *from;) *to+=*from+; *to=0;將拷貝操作編成一函數(shù):例T10-15-3.c,例T10-15字符串合并函數(shù):例T10-16.c,void append_string(char *

36、from,char *to) for(;*to; to+); for(; *from;) *to+=*from+; *to=0; 字符串合并函數(shù):例T10-16.c,閱讀程序:例T10-17.cvoid f (char *c) main() c+=2; char c20=”abcdef”; (*c)+; f(c+1); c+; *c=0; printf(“%s”,c); 閱讀程序:例T10-17.c內(nèi)存空間的動(dòng)態(tài)分配 在程序設(shè)計(jì)中,對(duì)于要處理的批量數(shù)據(jù),我們往往是選用數(shù)組作為存放這些數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),然而,數(shù)組有一個(gè)明顯的缺點(diǎn),就是在定義數(shù)組時(shí),其長(zhǎng)度必須是常值,無(wú)法根據(jù)需要?jiǎng)討B(tài)地定義。這樣,在

37、很多情況下,不是定義的數(shù)組長(zhǎng)度不夠,就是定義太長(zhǎng)以至于浪費(fèi)。 采用動(dòng)態(tài)分配可以克服這一缺點(diǎn),并且可以隨時(shí)釋放。 內(nèi)存空間的動(dòng)態(tài)分配 動(dòng)態(tài)分配內(nèi)存空間步驟: 定義一指針變量。 申請(qǐng)一片內(nèi)存空間,并將其首地址賦給指針變量。此時(shí)便可通過(guò)指針變量訪問(wèn)這片內(nèi)存;不成功則返回地址為0 用完后釋放這片內(nèi)存空間。 int *p; p=malloc(字節(jié)數(shù)); free(p);sizeof(類型):返回該類型數(shù)據(jù)在當(dāng)前編譯系統(tǒng)中所占的字節(jié)數(shù)。以上函數(shù)的原形在stdio.h中。p 動(dòng)態(tài)分配內(nèi)存空間步驟:p例:對(duì)n個(gè)學(xué)生的分?jǐn)?shù)排序后輸出。例T10-18.c #include “stdio.h”void sort(i

38、nt *a, int n) main() int *a,j,n; scanf(“%d”,&n); a=malloc(n*sizeof(int); if(!a) exit(0); for(j=0;jn;j+) scanf(“%d”,a+j); sort(a,n); for(j=0;jy) z=x; else z=y; return(z);main() int (*p)(); 定義指向函數(shù)的指針變量p int a,b,c; p=max; 將p指向函數(shù)max scanf(“%d%d”,&a,&b); c=(*p)(a,b); 通過(guò)p調(diào)用函數(shù)max 等效于c=max(a,b); printf(“n %

39、d”,c);例T10-19.cint max(int x, int y)把指向函數(shù)的指針變量作為函數(shù)參數(shù) 指向函數(shù)的指針變量最常見(jiàn)的用途是把它作為函數(shù)的參數(shù),用于接受主調(diào)函數(shù)傳來(lái)的某一函數(shù)的入口地址,從而在被調(diào)函數(shù)中可以通過(guò)該指針變量調(diào)用它所指向的函數(shù),這樣,被調(diào)函數(shù)中就可實(shí)現(xiàn)非固定函數(shù)的調(diào)用,以達(dá)到編寫(xiě)通用函數(shù)的目的。 例:用矩形法編寫(xiě)一個(gè)通用的求定積分的函數(shù)。關(guān)鍵問(wèn)題:如何處理被積函數(shù)是未知的。把指向函數(shù)的指針變量作為函數(shù)參數(shù)double intgral (double a,double b,int n, double (*f)() ) int i; double h,x,y,s=0; h=(b-a)/n; for(i=1;i=n;i+) x=a+(i-1)*h; y=(*f)(x); s+=h*y; return(s);例T10-20.cdouble f1(double x) return(3*x*x+2*x-1);main() double s; s=intgral(1.0,2.0,100

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論