

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、指針,,指針的故事,“該程序執(zhí)行了非法操作,即將關(guān)閉”這種錯(cuò)誤幾乎全是由指針和數(shù)組導(dǎo)致的黑客攻擊服務(wù)器利用的bug絕大部分都是指針和數(shù)組造成的,主要內(nèi)容,1.地址和指針的概念 2.變量的指針和指向變量的 指針變量 3.數(shù)組與指針 4.字符串與指針 5.指向函數(shù)的指針 6.返回指針值的函數(shù) 7.指針數(shù)組和指向指針的指針,地址,內(nèi)存中每一個(gè)字節(jié)的存貯單元都有一個(gè)編號(hào),這個(gè)編號(hào)就是“地址” 。如果在程序中定義了一
2、個(gè)變量,在對(duì)程序進(jìn)行編譯時(shí),系統(tǒng)就會(huì)給這個(gè)變量分配存貯單元。,1.按變量地址存取變量值的方式稱為“直接訪問”方式 scanf(″%d″,&i); printf(″%d″,i); k=i+j;,將每個(gè)數(shù)據(jù)的首字節(jié)地址作為該數(shù)據(jù)的地址。,內(nèi)存是一個(gè)連續(xù)編址的空間,每一個(gè)存儲(chǔ)單元都有一個(gè)固定的編號(hào),這個(gè)編號(hào)稱為地址。 地址是一個(gè)無符號(hào)整數(shù)(通常用16進(jìn)制數(shù)),其字長(zhǎng)與主機(jī)相同,例如:已定義了
3、一個(gè)整型數(shù)組d[6]。設(shè)該數(shù)組的起始地址為ee10(d[0]的地址),賦值d[0]=10。數(shù)組名是一個(gè)常量地址 , 也為ee10,2000 2002 2004,用戶內(nèi)存數(shù)據(jù)區(qū),,(1) 求地址運(yùn)算(&)每個(gè)變量/數(shù)組都有一個(gè)內(nèi)存地址,在何地址一般無法預(yù)測(cè)??赏ㄟ^求地址運(yùn)算得到。,2、求地址運(yùn)算和訪問地址運(yùn)算,例:#include main(){int a=1;float
4、 b=2.0;double c=3;int d[6]={-1,-2,-3,-4,-5,-6};printf(“address of a is%x\n”,&a);printf(“address of b is%x\n”,&b);printf(“address of c is%x\n”,&c);printf(“address of d is%x\n”,&d);printf(“address o
5、f d[0] is%x\n”,&d[0]);},說明:①輸出的地址值 用4位十六進(jìn)制數(shù)表示。②&只能施加在變量或數(shù)組元素上。 &25 &(x+y)均是錯(cuò)誤的,采用訪問地址的方法存取數(shù)據(jù),速度快,效率高。,將地址存放在一種特殊類型的變量中,把對(duì)地址的操作轉(zhuǎn)換為對(duì)變量的操作。,存放地址的變量——指針變量指針變量中存放的地址——指針,變量地址:變量一定占用一個(gè)數(shù)據(jù)的存儲(chǔ)空間,該存儲(chǔ)空間的首地址
6、稱變量地址。指針:一個(gè)變量的地址稱為該變量的指針。指針變量:若一個(gè)變量專用于存放另一個(gè)變量 的地址(指針),則該變量稱為指 針變量。指針的對(duì)象:指針指向的存儲(chǔ)空間中的數(shù)據(jù)。,指針的概念,,指針變量是存放地址的變量,它的值是指針,指針?biāo)赶虻淖兞渴侵羔樧兞克赶虻拇尜A單元中的內(nèi)容,指針變量,指針?biāo)赶虻淖兞?10.2.1 定義一個(gè)指針變量,定義指針變量的一般形式為基類型 *指針變量名;int i,j,*pointer_1,*
7、pointer_2;//基類型是int下面都是合法的定義:float *pointer_3; char *pointer_4;,指針變量的引用 (1)指針變量只能存放地址,不能將整型數(shù)據(jù)、字符型數(shù)據(jù)、實(shí)型數(shù)據(jù)等非地址類型的數(shù)據(jù)賦值給指針變量。 (2)指針變量只能指向同一類型的變量。 int a=8 ;char h=’A’; int *p1;
8、 char *p2; p1=&a; p2=&h;,,int a ,*p ; p =&a; *p=5;,(1) &a 表示取a變量的地址。 *p則表示指針變量p所指的對(duì)象a 。,,*p,*&a,&*p,相關(guān)的運(yùn)算符 取地址運(yùn)算符: &
9、 指針運(yùn)算符(或間接訪問運(yùn)算符): *,(2) ?, &為同級(jí)運(yùn)算符,結(jié)合性從右至左。 當(dāng)執(zhí)行了 p=&a; 后,則下列表示是等價(jià)的: 對(duì)象:a= =*p==*&a ==*(&a) 指針:p= =&a= =&*p = =&(*p) (3)&*p 等價(jià)于&a
10、 &*p 即 &(*p1)與 &a等價(jià)。 (4) p1=&*p; 的作用是 p1=&a; (5)(*p )++ 等價(jià)于a++。 (6) &與*互為逆運(yùn)算,當(dāng)?與&連續(xù)在一起時(shí),具有抵消作用: *&a= =a , &*p= =p .,7、指針變量的賦值運(yùn)算用取地址運(yùn)算符(&
11、amp;) 將一個(gè)變量的地址賦給一個(gè)指針變量。 int i, ?p ; i=3; p=&i;,? 將一個(gè)指針變量賦給另一個(gè)同類型的指針變量。,int i , ?pi , ?pj ;,pi=&i ;,pj=pi ;,作用是使 pi , pj 都指向變量 i。,,,&i,&i,? 給指針變量(pi)賦“空”值:,a. pi=NULL;,b. pi=0,c.
12、 pi='\0',④ 在定義一個(gè)變量時(shí),將變量的指針(即地址) 直接賦給指針變量:,int x, ?p=&x;,可以用賦值語句使一個(gè)指針變量得到另一個(gè)變量的地址,從而使它指向一個(gè)與基類型相同的變量。例如:pointer_1=&i;pointer_2=&j;,在定義指針變量時(shí)要注意兩點(diǎn):,10.2.2 指針變量的引用,1.給指針變量賦初值 int *p,*q; int a=10;
13、 (1)q=&a; 或 (2) p=q;//讓p指向q所指向的存貯單元,,a,,q,10,10.2.2 指針變量的引用,1.給指針變量賦初值 int *p,*q; int a=10; (1)q=&a; 或 (2) p=q;//讓p指向q所指向的存貯單元,,a,,q,10,10.2.2 指針變量的引用,1.給指針變量賦初值 int *p,*q; int a=10;
14、 (1)q=&a; 或 (2) p=q;//讓p指向q所指向的存貯單元,,a,,q,p,,10,注意:指針變量中只能存放地址(指針),不要將一個(gè)整數(shù)(或任何其他非地址類型的數(shù)據(jù))賦給一個(gè)指針變量。,2. 訪問指針變量所指向的變量printf(“%d”,*p);說明:(1)定義指針變量后,變量沒指向任何存貯單元,要通過賦值語句來確定它所指向的存貯單元(2)&,*的優(yōu)先級(jí)相同,結(jié)合方向自右向左,為
15、互逆操作&*p p,,,*&a a,(3)(*p)++與*p++的區(qū)別 前者是為p所指向的變量+1,后者滿足右結(jié)合,p++后執(zhí)行*操作,但++是后加,所以先使用*p的值,然后再對(duì)p進(jìn)行+1操作 *(++p)?,例10.1 通過指針變量訪問整型變量#include void main(){ int a,b; int *pointer_1,*point
16、er_2; a=100; b=10; pointer_1=&a; /*把變量a的地址賦給pointer_1 */ pointer_2=&b; /*把變量b的地址賦給pointer_2 */ printf("%d,%d\n",a,b); printf("%d,%d\n",*pointer_1, *pointer_2)
17、;},100,10,,例10 . 2 輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出 a和b。,#includemain(){int a,b,*p1,*p2,*p;scanf("%d%d",&a,&b);p1=&a;p2=&b;if (a<b) {p=p1;p1=p2;p2=p;}printf("*p1=%d,*p2=%d\n
18、",*p1,*p2);printf("a=%d,b=%d\n",a,b);},例10 . 2 輸入a和b兩個(gè)整數(shù),按先大后小的順序輸出 a和b。,#includemain(){int a,b,*p1,*p2,*p;scanf("%d%d",&a,&b);p1=&a;p2=&b;if (a<b) {p=
19、p1;p1=p2;p2=p;}printf("*p1=%d,*p2=%d\n",*p1,*p2);printf("a=%d,b=%d\n",a,b);},a,b的值沒發(fā)生變化!!!,p=p1; p1=p2;p2=p;,&a,,,p=p1; p1=p2;p2=p;,&a,,&b,,,p=p1; p1=p2;p2=p;,&a,,&b,,&
20、;a,,,p=p1; p1=p2;p2=p;,&b,,&a,,,p=p1; p1=p2;p2=p;,*p1=9, *p2=5a=5, b=9,10.2.3 指針變量作為函數(shù)參數(shù),例10 . 3 交換兩個(gè)變量的值,#includemain(){void swap(int *p1,int *p2); int a,b; int *pointer_1,*pointer_2; scanf("%d%
21、d",&a,&b); pointer_1=&a; pointer_2=&b;swap(pointer_1,pointer_2); printf("%d %d\n",a,b);},void swap(int *p1,int *p2){int temp;temp=*p1;*p1 = *p2;*p2 =temp;},,,,void swap(int *p1
22、,int *p2){int temp;temp=*p1;*p1 = *p2;*p2 =temp;},,,,void swap(int *p1,int *p2){int temp;temp=*p1;*p1 = *p2;*p2 =temp;},,,,void swap(int *p1,t *p2){int temp;temp=*p1;*p1 = *p2;*p2 =temp;},,,,如果將swap函數(shù)做如下修
23、改:,void swap(int *p1,int *p2){int *temp; temp=p1; p1 = p2; p2 =temp;},如果將swap函數(shù)做如下修改:,void swap(int *p1,int *p2){int *temp; temp=p1; p1 = p2; p2 =temp;},沒有實(shí)現(xiàn)交換操作!!!,,,,void swap(int *p1,int *p2){in
24、t *temp; temp=p1; p1 = p2; p2 =temp;},,,,void swap(int *p1,int *p2){int *temp; temp=p1; p1 = p2; p2 =temp;},,,,void swap(int *p1,int *p2){int *temp; temp=p1; p1 = p2; p2 =temp;},,,,
25、,&a,&b,9,5,,,,9,5,5,9,使用指針做形參的說明,如果要通過函數(shù)調(diào)用得到n個(gè)要改的值,要經(jīng)過以下步驟:(1)主函數(shù)中設(shè)n個(gè)變量,并用n個(gè)指針變量分別指向它們(2)用指針變量作形參(3)通過形參指針變量,改變n個(gè)實(shí)參的值(4)主調(diào)函數(shù)中使用這些改變了值的變量,上節(jié)課小結(jié),1.指針與指針變量2.指針?biāo)赶虻淖兞?.用指針訪問其所指向的變量4.用指針變量做為函數(shù)的形參,,int *p,i;p=&
26、amp;i; *pi,*pvoid swap(int *p,int *q),例10.4 輸入a,b,c 3個(gè)整數(shù),按從大到小順序輸出,#include void main(){ void exchange(int *q1, int *q2, int *q3); int a,b,c,*p1,*p2,*p3; scanf("%d%d%d",&a,&b,&c); p1
27、=&a;p2=&b;p3=&c; exchange (p1,p2,p3); printf("\n%d,%d,%d\n",a,b,c); },void exchange(int *q1, int *q2, int *q3){ void swap(int *pt1, int *pt2); if(*q1<*q2) swap(q1,q2);
28、if(*q1<*q3) swap(q1,q3); if(*q2<*q3) swap(q2,q3);} void swap(int *pt1, int *pt2) {int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; },10.3 數(shù)組與指針,一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址。
29、指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素(把某一元素的地址放到一個(gè)指針變量中)。所謂數(shù)組元素的指針就是數(shù)組元素的地址。,定義一個(gè)指向數(shù)組元素的指針變量的方法,與以前介紹的指向變量的指針變量相同。例如:int a[10]; int *p; p=&a[0];,10.3.1 指向數(shù)組元素的指針,,p=a;,,p+i,&a[i],,*( ),,10.3.2通過指針引用數(shù)組元素
30、,引用一個(gè)數(shù)組元素,可以用:(1) 下標(biāo)法,如a[i]形式或p[i](但要先執(zhí)行p=a );(2) 指針法,如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組元素的指針變量,其初值p=a。( 3 )p=a; p++,用*p訪問數(shù)組元素,說明: ( 1 )指針可以實(shí)現(xiàn)++和--操作,但數(shù)組名不可以,因?yàn)閿?shù)組名是一個(gè)指針常量 ( 2 )p++代表指針移向下一個(gè)數(shù)組元素,而不是一個(gè)存貯單元,int型下移兩個(gè)單元,float型
31、下移4個(gè)單元,假設(shè)有一個(gè)a數(shù)組,整型,有10個(gè)元素。要輸出各元素的值有三種方法: (1)下標(biāo)法。(2) 通過數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。(3) 用指針變量指向數(shù)組元素。,例10.5 輸出數(shù)組中的全部元素。,(1)下標(biāo)法。main(){int a[10];int i;for(i=0;i<10;i++) scanf(“%d”,&a[i]);printf("\n");
32、for (i=0;i<10;i++) printf(“%d”,a[i]); },(1)下標(biāo)法。main(){int a[10];int i, *p;for(i=0;i<10;i++) scanf(“%d”,&a[i]);printf("\n");p=a;for (i=0;i<10;i++) printf(“%d”,p[i]); },(2) 通過
33、數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。main(){int a[10]; int i;for(i=0;i<10;i++) scanf(“%d”,&a[i]);printf("\n");for (i=0;i<10;i++) printf(“%d”,*(a+i)); },(2) 通過數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。main(){int a[10];
34、int i ,*p;for(i=0;i<10;i++) scanf(“%d”,&a[i]);printf("\n");p=a;for (i=0;i<10;i++) printf(“%d”,*(p+i)); },(3) 用指針變量指向數(shù)組元素。main(){int a[10]; int *p; int i;for(i=0;i<10;i++)
35、 scanf("%d",&a[i]);for(p=a;p<(a+10);p++) printf("%d",*p);},(4)用--操作實(shí)現(xiàn)逆向輸出元素,void main(){int a[10]; int *p; int i;for(i=0;i=a;p-- ) printf("%5d",*p);},例10.6 通過指針變量輸出a數(shù)組的1
36、0個(gè)元素。,main(){int a[10], *p, i; p=a;for(i=0;i<10;i++) scanf("%d",p++);for(i=0;i<10;i++,p++) printf("%d\n",*p);},main(){int a[10], *p, i; p=a;for(i=0;i<10;i++) scanf(“
37、%d”,p++);p=a;for(p=a;i<10;i++,p++) printf(“%d”,*p);},10.3.3 用數(shù)組名作函數(shù)參數(shù),在第8章8.7節(jié)中介紹過可以用數(shù)組名作函數(shù)的參數(shù)如: void main() {f(int arr[ ],int n); int array[10]; …… f(array,10);
38、 …… } void f(int arr[],int n) { …… },例10.7 將數(shù)組a中n個(gè)整數(shù)按相反順序存放。,main(){int a[10]={1,2,3,4,5,6,7,8,9,10};int i;inv(a,10);for(i=0;i<10;i++)
39、 printf("%3d",a[i]);printf("\n");},void inv(int x[],int n){int *i,*j;int temp,m;m=n/2;i=x; j=x+n-1;for(;i<x+m;i++,j--){temp=*i;*i=*j;*j=temp;}},對(duì)剛才的程序可以作一些改動(dòng)。將函數(shù)inv中的形參x改成指針變量。,void inv
40、(int *x,int n){int temp,*i,*j,m=(n-1)/2;i=x;j=x+n-1;for(;i<=x+m;i++,j--){ temp=*i; *i=*j; *j=temp;}},如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組中的元素的值,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下4種情況:,(1) 形參和實(shí)參都用數(shù)組名,如:void main() void f(
41、int x[ ],int n){ int a[10]; { … … f(a,10); } },(2) 實(shí)參用數(shù)組名,形參用指針變量。如:void main() void f(int *x,int n){int
42、a[10]; { … … f(a,10); } },(3)實(shí)參形參都用指針變量。例如:void main() void f(int *x,int n){int a[10], *p=a; {
43、 … … f(p,10); } },(4) 實(shí)參為指針變量,形參為數(shù)組名。如: void main() void f(int x[ ],int n){int a[10],*p=a; { …
44、 … f(p,10); } },例10.7 從10個(gè)數(shù)中找出其中的最大值和最小值,int max,min;void max_min(int array[],int n){int *p,*array_end;max=min=*array;array_end=array+n;
45、for(p=array+1;pmax) max=*p;else if (*p<min) min=*p;},main(){int a[10]={6,7,8,1,2,3,4,5,9,10};max_min(a,10);printf("max=%3d,min=%3d\n",max,min);},10.3.4 多維數(shù)組與指針,用指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素。但在概念
46、上和使用上,多維數(shù)組的指針比一維數(shù)組的指針要復(fù)雜一些。,復(fù)習(xí)一維數(shù)組與指針之間的關(guān)系,int a[10],*p; p =a; p =&a[i]==a+i; *p=*(a+i)==a[i];,,p,,p+i,,1. 多維數(shù)組元素的地址,先回顧一下多維數(shù)組的性質(zhì),可以認(rèn)為二維數(shù)組是“數(shù)組的數(shù)組”,例 :定義int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};則二維數(shù)組a
47、是由3個(gè)一維數(shù)組所組成的。,a[0],a[1],a[2],a,,a+1,a+2,,,,a+i == &a[i],(1)a,a+1,a+2分別代表&a[0],&a[1],&a[2],,a[0],a[1],a[2],,a+i == &a[i],(2)a[0],a[1],a[2]分別代表&a[0][0],&a[1][0],&a[2][0],a[0],a[1],a[2],a,,a+
48、1,a+2,,,,a+i == &a[i],a[2]+1,a[2]+2分別代表&a[2][1],&a[2][2],,,,a[i]+j,,(3)&a[i][j],,a[0],a[1],a[2],a,,a+1,a+2,,,,a+i == &a[i],*(a+i)+j,&a[i][j],,*(a+i) == a[i],,,a[i]+j,,a[0],a[1],a[2],a,,a+1,a+2,,,,
49、a+i == &a[i],*(a+i)+j,(4)&a[i][j],,*(a+i) == a[i],,,a[0],a[1],a[2],a,,a+1,a+2,,,,a+i == &a[i],*(*(a+i)+j),(5)*(&a[i][j]),,*(a+i) == a[i],,,a[0],a[1],a[2],a,,a+1,a+2,,,,a+i == &a[i],*(*(a+i)+j),(5)
50、a[i][j],,*(a+i) == a[i],,,a[0],a[1],a[2],a,,a+1,a+2,,,,a+i與*(a+i)有什么區(qū)別?,,,小結(jié),(1)a,a+1,a+2分別代表&a[0],&a[1],&a[2](2)a[0],a[1],a[2]分別代表&a[0][0],&a[1][0],&a[2][0](3) a[i]+j 代表&a[i][j](4) *(a+i)+
51、j代表&a[i][j](5)*(*(a+i)+j)代表a[i][j]a[i]從形式上看是一維數(shù)組的第i個(gè)分量,但當(dāng)a為二維數(shù)組時(shí),a[i]只代表一個(gè)地址,2.指向二維數(shù)組的指針變量,(1)用指針變量輸出數(shù)組元素的值 main(){int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int *p;//printf("%o\n%o\n%o\n%o\n&quo
52、t;,a,a[0],&a[0],&a[0][0]); for(p=a[0];p<a[0]+12;p++) {if ((p-a[0])%4==0) printf("\n"); printf("%4d",*p); }}用普通的指針變量輸出數(shù)據(jù)元素時(shí),要先二維數(shù)組序列化為一維,然后再輸出.接下來定義提向一維數(shù)組的指針變量.,(2)指向一維數(shù)組的指針
53、變量,指向一維數(shù)組的指針變量的聲明形式: int (*p)[4]; p可以指向由四個(gè)分量組成的一維數(shù)組,p每次+1,移動(dòng)的單元數(shù)是一維數(shù)組所占的單元數(shù),它等同于二維數(shù)組的行移動(dòng). 因此,p等價(jià)于二維數(shù)組。,例,輸出二維數(shù)組中任一行任一列元素的值main(){int a[3][4]= {1,2,3,4,5,6,7,8,9,10,11,12};int i,j,(*p)[4];p=a;scanf("%d%d&quo
54、t;,&i,&j);printf("%d\n",*(*(p+i)+j));},3.用指向數(shù)組的指針作函數(shù)參數(shù),一維數(shù)組名可以作函數(shù)參數(shù),多維數(shù)組名也可以做為參數(shù)傳遞。用指針變量做形參時(shí)接收實(shí)參數(shù)組名傳遞來的地址時(shí),有兩種方法:指向變量的指針變量,實(shí)參為 *數(shù)組名指向一維數(shù)組的指針變量,實(shí)參為 數(shù)組名,例,有一個(gè)班有3名學(xué)生,4門課程,計(jì)算總平均分以及查找第n個(gè)學(xué)生的成績(jī)。 main()
55、{void average(float *p,int n);void search(float (*p)[4],int n);float score[3][4]={65,67,70,60,80,87,90,81,90,99,100,98};average(*score,12);search(score,2);},void average(float *p,int n){int i;float *p_end;float
56、sum=0.0,avg;p_end=p+n-1;for(;p<p_end;p++)sum=sum+(*p);avg=sum/n;printf("average=%5.2f\n",avg);},void search(float (*p)[4],int n){int i;printf("the score of number %d student is \n",n);for(
57、i=0;i<4;i++)printf("%5.0f",*(*(p+n)+i));},例,在上題的基礎(chǔ)上,查找有一門以上課程不及格的學(xué)生,打印出他們的全部課程成績(jī),void search(float (*p)[4],int n) {int i,j,flag; for(i=0;i<n;i++) {flag=0; for (j=0;j<4;j++) if (*(*(p+i)
58、+j)<60) flag=1;,if (flag==1){ printf("number %d student fails:\n",i); for(j=0;j<4;j++) printf("%5.1f", *(*(p+i)+j)); printf("\n"); } //if} //for},10.4 字符串與指針,1.字符串的
59、表示形式C語言用兩種方式處理字符串字符型數(shù)組 main(){char str[]=”I love China”; printf(“%s\n”,str);}字符指針 main(){char *str=”I love China”;printf (“%s\n”,str); },說明:(1)char *str=”I love China”;等價(jià)于char *
60、str;str=”I love China”;把字符串的首地址賦給str,不等價(jià)于char *str;*str=”I love China”;,,,(2)用字符型指針變量或字符數(shù)組表示的字符串可以用%s整體輸入輸出,其他類型的指針變量或數(shù)組不可以,只能逐個(gè)分量操作。,例,將字符串a(chǎn)復(fù)制到字符串b main(){char a[15]="I am a boy"; char b[15];int i;
61、for(i=0;*(a+i)!='\0';i++) *(b+i)=*(a+i);*(b+i)='\0';for(i=0;b[i]!='\0';i++) printf("%c",b[i]);//printf("%s",b);},用指針變量處理上題 main(){char a[]=”I am a boy”,b[20
62、],*p1,*p2;int i;p1=a;p2=b;for(;*p1!=’\0’;p1++,p2++) *p2=*p1;*p2=’\0’;printf(“%s”,b);},2.字符串指針作函數(shù)參數(shù),字符串?dāng)?shù)組或指針做函數(shù)參數(shù)可以實(shí)現(xiàn)地址傳遞(1)用字符數(shù)組做參數(shù) void copy_str(char from[],char to[]) {int i=0; while (from[i]!=’\0
63、’) { to[i]=from[i]; i++; } to[i]=’\0’;},(2)形參用字符指針變量 void copy_str(char *from,char *to) { for(;*from!=’\0’;from++,to++) *to=*from; *to=’\0’; },對(duì)上述函數(shù)體可有多種寫法,(1)while((*to=*from)!=
64、’\0’) {to++;from++}(2)while((*to++=*from++)!=’\0’);(3)while (*from!=’\0’) *to++=*from++;*to=’\0’;(4)while(*to++=*from++);它等價(jià)于 while((*to++=*from++)!=’\0’);(5)for(;(*to++=*from++)!=0;);或(6)for(;*to++=*from++
65、;);,形參為數(shù)組時(shí),也可以用指針變量 void copy_str(char from[],char to[]) {char *p1,*p2; p1=from; p2=to; while((*p2++=*p1++)!=’\0’); }形參和實(shí)參都可以是字符數(shù)組或字符指針變量,很靈活,3.對(duì)字符指針變量和字符數(shù)組的討論,(1)字符數(shù)組的每個(gè)元素存放一個(gè)字符,字符指針變量只存放字符串的首地址
66、,而不是將字符串放到字符指針變量中(2)賦值方式,對(duì)字符數(shù)組只能對(duì)各元素賦初值,字符指針變量可以整體賦值 char str[20]; str=”I love China”;//錯(cuò)誤的 上述兩語句不等價(jià)于:char str[20]=”I love China”,,,char *a;a=”I love China”; //合法的上面兩語句等價(jià)于:char *a=”I love China”; (3)定義了字符數(shù)組
67、后,編譯時(shí)對(duì)數(shù)組分配單元,而字符指針變量不分配單元,要人為賦初值(通常指向某一數(shù)組首址) char *s; scanf(“%s”,s);//語法上沒有錯(cuò)誤,但危險(xiǎn) 通常的做法: char *s,str[10]; s=str; scanf(“%s”,s);,(4) 指針變量的值可以改變,而數(shù)組名是常量,不可以改變其值 char *a=”I love China”; a=a+7; pr
68、intf(“%s”,a);結(jié)果是China,字符指針變量輸出字符串時(shí)從當(dāng)前位置開始,輸出到’\0’為止。(5) 定義了一個(gè)指針變量并使它指向一個(gè)字符串后,就可以用下標(biāo)形式引用其中的字符。 char *a=”I love China”;……a[i],10.5 指向函數(shù)的指針,1.用函數(shù)指針變量調(diào)用函數(shù) 一個(gè)函數(shù)在編譯時(shí)初分配一個(gè)入口地址,這個(gè)地址就稱為函數(shù)的指針,可以用一個(gè)指針變量指向函數(shù),然后通過該指針變量
69、調(diào)用此函數(shù)。函數(shù)名代表該函數(shù)的入口地址,main() { int max(int,int); int (*p)();//定義指向整型函數(shù)的指針 int a,b,c; p=max; scanf("%d%d",&a,&b); c=max(a,b); c=(*p)(a,b);//c=p(a,b);也可以 printf("
70、;max=%d\n",c);},(1)指向函數(shù)的指針變量的一般定義形式: 數(shù)據(jù)類型 (*指針變量名)();(2)函數(shù)調(diào)用可以通過函數(shù)名,也可以通過函數(shù)指針調(diào)用(3)(*p)()只是定義了一個(gè)指向函數(shù)的指針變量,但指向哪一個(gè)并不確定;在一個(gè)程序中,一個(gè)指針變量可以先后指向返回類型相同的不同函數(shù)(4)給函數(shù)指針變量賦初值時(shí),只給函數(shù)名不給參數(shù)(5)調(diào)用函數(shù)時(shí),用(*p)取代函數(shù)名,實(shí)參照常(6)對(duì)指向函數(shù)的指針
71、變量進(jìn)行加減運(yùn)算沒有意義,如p++,2.用指向函數(shù)的指針作函數(shù)參數(shù),函數(shù)指針變量的主要用途是做函數(shù)參數(shù)。形參是指向函數(shù)的指針變量,實(shí)參是函數(shù)名,結(jié)合的過程就是將函數(shù)的地址傳給形參。通過用函數(shù)指針變量做函數(shù)形參,可以實(shí)現(xiàn)靈活調(diào)用不同的函數(shù),提高函數(shù)的通用性。 例,設(shè)一個(gè)函數(shù)process,在調(diào)用它的時(shí)候,每次實(shí)現(xiàn)不同的功能。輸入a,b后,第一次調(diào)用時(shí)找出a和b中的大者,第二次找出小者,第三次求a+b;,main(){ int
72、max(int,int); int min(int,int); int add(int,int); int process(int,int,int(*fun)()); int a,b; scanf("%d%d",&a,&b);,printf("max=");process(a,b,max);printf("min=")
73、;process(a,b,min);printf("add=");process(a,b,add);},process(int x,int y,int(*fun)()){ int result; result=(*fun)(x,y); printf(“%d\n”,result);},說明:主函數(shù)中對(duì)max(),min(),add()等三個(gè)函數(shù)的聲明是必不可少的,以前函數(shù)不聲明,隱含為函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)基礎(chǔ)知識(shí)
- 計(jì)算機(jī)基礎(chǔ)知識(shí)
- 計(jì)算機(jī)基礎(chǔ)知識(shí)習(xí)題
- 計(jì)算機(jī)基礎(chǔ)知識(shí)大全
- 計(jì)算機(jī)基礎(chǔ)知識(shí)教案
- 計(jì)算機(jī)基礎(chǔ)知識(shí) 試題
- [計(jì)算機(jī)]sybase基礎(chǔ)知識(shí)
- 計(jì)算機(jī)基礎(chǔ)知識(shí)28795
- 計(jì)算機(jī)基礎(chǔ)知識(shí)題庫
- 計(jì)算機(jī)基礎(chǔ)知識(shí)試題
- 計(jì)算機(jī)基礎(chǔ)知識(shí)1
- 計(jì)算機(jī)基礎(chǔ)知識(shí)2
- 計(jì)算機(jī)基礎(chǔ)知識(shí)練習(xí)
- 計(jì)算機(jī)的基礎(chǔ)知識(shí)
- 計(jì)算機(jī)基礎(chǔ)知識(shí) (2)
- 計(jì)算機(jī)基礎(chǔ)知識(shí)試題
- 計(jì)算機(jī)基礎(chǔ)知識(shí)培訓(xùn)
- 計(jì)算機(jī)基礎(chǔ)知識(shí)題
- 計(jì)算機(jī)基礎(chǔ)知識(shí)題
- 計(jì)算機(jī)基礎(chǔ)知識(shí)部分
評(píng)論
0/150
提交評(píng)論