課件第6章指針和引用_第1頁
課件第6章指針和引用_第2頁
課件第6章指針和引用_第3頁
課件第6章指針和引用_第4頁
課件第6章指針和引用_第5頁
免費預覽已結束,剩余66頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 )掌握指針的基本概念、指針變量的定義、引用 與運算;)熟悉指向指針的指針;)掌握指針與數組、指針與函數的相關操作。要求:第6章 指針和引用 學習C語言, 如果你不能用指針編寫有效、正確而靈活的程序, 可以認為你沒有學好C語言。地址、指針、數組及其相互關系是C語言中最具特色的部分。規范地使用指針, 可以使程序更加簡潔明了, 因此, 我們要學會在各種情況下正確地使用指針。(1)利用指針能間接引用它所指的對象。(2)指針能用來描述數據和數據之間的關系, 以便構造復雜的數據結構。(3)利用各種類型指針形參,能使函數增加活力。(4)指針與數組結合,使引用數組元素的形式 更加多樣、訪問數組元素的手段更加

2、靈活。(5)熟練正確應用指針能寫特別緊湊高效的程序。指針在C程序中的作用地址和指針的概念內存按字節編址,每個字節單元都有一個地址。程序中定義的任何變量,在編譯時都會在內存中分配一個確定的地址單元。我們怎樣知道機器將某種數據放在內存的什么地方呢?可用求地址運算符&,例如定義了:int a = 10 ;則&a就代表變量a在內存中的地址。因為地址運算符&就是取其后變量a的地址。可以用 printf(%xn , &a); 看其地址。注意,這個地址并不是始終不變的,這是由系統來安排的,我們無法預先知道。以后我們所講的地址都是假設的.6.1 指針基本概念C語言規定:如果變量占用連續的多個字節,則第一個字節

3、的地址就是該變量的地址。例如定義:shorta=10;floatb=10;則編譯系統給變量分配的內存空間如圖6.1所示。從圖6.1中可以看出,假設變量a的內存地址為2000,則變量b的內存地址為2002。 程序在引用變量時,首先獲得該變量的地址,這還只是變量的首地址,然后還要根據變量的數據類型決定要從首地址開始連續取幾個字節來獲取變量的值。若定義如圖6.1,現程序要獲取變量b的值,則先確定變量首地址為2002,然后由變量b的數據類型float知變量占4個字節,所以從首地址開始連續取4個字節的數據即為變量b的值。圖6.1變量分配的內存示意short 型變量a占2個字節單元float 型變量b占4

4、個字節單元 指針與變量這里:a,b是變量,而p是指針變量,存放的是地址20002010abp變量地址內存變量名圖6.2變量a與指針變量p的關系200020028000使用一個變量可以直接通過變量名,這種方式稱為直接存取方式。還可以將變量的地址存入另一“特殊”變量中,然后就可以通過該“特殊”變量來存取變量的值,這種存取變量的方式稱為“間接存取方式”。而存放地址的變量就好像存放了一個指針,指向要存取值的變量,故稱為“指針變量”。可稱為“指向變量的指針變量”。 short a=10,b=20,*p=&a; 指針變量也是變量,在使用之前必須先定義。定義時也可對其賦初值。指針變量的定義格式為:存儲類型

5、類型說明符 *pointer=初值; 表示定義了一個存放某種類型為類型說明符的變量地址的變量,稱為pointer。其中,pointer是指針變量的名字,并且必須由字符*作為指針的前導。 由于指針的存儲單元是用來存放地址的,該地址必定是某個存儲單元的地址。稱指針指向該存儲單元,并且把指針所指向的存儲單元稱為指針的目標(對象,object)。簡而之,指針變量是專門用來存放變量地址的. 指針變量的定義例如:short i; /定義整型變量i short *ip ; /定義整型指針 short *p;/定義整型指向指針的指針變量pip=&i;如果變量i是指針ip的目標,稱指針ip指向變量i,簡稱ip指

6、向i。我們用帶箭頭的直線從指針ip指向其目標i(如圖)。指針ip 圖6.3. 指針變量與它所指變量關系圖變量iFF10FF10指針ip的值為變量i的地址FF105箭頭表明指針ip指向對象i稱變量i是指針ip的對象假設:變量i的地址為FF10 在定義指針變量時,應注意以下幾點:(1)類型說明符表示該指針變量所指向的變量的數據類型。如int、float、double、char等。(2)定義指針變量時,指針變量名前必須有一個“*”號, 表示定義的變量是指針變量,否則就變成了普通整型變量。 double c,*p;(3)指針變量在定義時允許對其賦初值。如:double c,*p=&c; /令指針p初始

7、化為變量c的地址需要特別指出的是:這里是用&c對p初始化, 而不是對*p初始化。初始化后指針變量p中存放的是實型變量c的地址。 給指針變量賦值(1) 指針變量名=&變量名;作用: 使指針指向一個對象。通過求地址運算符(&)把一個變量的地址賦給指針變量。“&”是求地址運算符,該運算符為單目運算符,用于求變量的地址,且該變量必須為內存變量。例如: int a=8,b,*pa,pb; pa=&a; pb=&b;a=8; -直接訪問整型變量a指針變量pa.20008000800280012001200282000 2000*pa=8; -間接訪問pa中存放的是整型變量a的地址圖6.4指針變量名變量&a

8、8paa&bpbb 當一個指針(如 pa)獲得某個變量(如a)的地址時,我們稱這個指針指向該變量,即使該變量成為指針的對象。假設變量 a 的地址為2000,則當pa 指向a 后,pa 的值就等于2000。 也可以在定義指針變量的同時賦初值,例如: inta=8 ,*p=&a; 和前面表述的一樣,這里是用&a對p初始化, 而不是對*p初始化。初始化后指針變量p中存放的是整型變量a的地址。 另外,讀者一定還記得在前面調用scanf函數時,其函數調用格式中,輸入數據所對應的各變量名之前都必須加運算符& ,這就是我們所說的求地址運算符。scanf函數把從終端讀入的數據依次放入這些地址所代表的存儲單元中

9、,也就是說scanf函數要求輸入項是地址值。因此接上例,scanf(“%d%d”,&a,&b) ; 語句和scanf(“%d%d” , pa,pb); 語句是等價的,都是將終端輸入的整型數據存入到變量a和變量b所在的存儲單元中。(2) 同類型指針變量之間可以直接賦值。 可以把指針變量的值賦給指針變量,但一定要確保這兩個指針變量的類型是相同的。 2000102000指針變量p變量a指針變量q2000(&a)例如:float x; int a=10,*p,*q; p=&a; /*方式1*/ q=p; /*方式2*/執行以上語句后,使指針變量q也存放了變量a的地址,也就是說指針變量p和q同時指向了變

10、量a。如執行 p=&x ; 語句,則是絕對錯誤的。為什么?請讀者想一想!(3) 給指針變量賦“空”值 為了使指針變量有一確定的數值,除了給指針變量賦一地址值外,當指針變量沒有指向的對象時,也可以給指針變量賦NULL值,此值為空值。例如:int *p ; p=NULL ; NULL指針p 表示指針變量p為空指針,暫不指向任何變量。 對于靜態或全局的指針變量,如果在定義時未給它指定初值,系統自動給它指定初值為0,讓它暫時是一個空指針。使指針的值等于零(或者等于空),稱為指針清零。NULL是在stdio.h頭文件中定義的預定義符,因此在使用NULL時,應該在程序的前面出現預定義命令行:#includ

11、e “stdio.h”。NULL的代碼值為0,所以語句p=NULL ;等價于:p=0 ; 都是表示指針變量p是一個空指針,沒有指向任何對象。給指針變量賦值舉例: int i = 100, j, *ip, *intpt; float f, *fp; 以下都是不正確的賦值 ip = 100; /* 指針變量不能賦整數值*/ intpt = j;/*指針變量不能賦整型變量的值*/ fp = &i;/能指向float型變量,不能指向int型變量 fp = ip;/不同類型指針變量不能相互賦值 即一個指針變量只能指向同一個類型的變量。因為,定義什么樣的類型指針變量,該指針變量只能存放什么樣類型變量的地址

12、,兩者必須一致,否則就可能出現了張冠李戴的錯誤現象。而以下都是正確的賦值:ip = &i ; /* 使ip指向i */intpt = ip ; /使intpt指向ip所指變量 同類型的指針變量可以相互賦值;fp = &f ; /*使fp指向f*/ip = NULL ;/使ip不再指向任何變量i的地址ipi的值iintpti的地址圖6.5指針變量引用 當指針變量中存放了一個確切的地址值時,通過指針可以用“間接運算符”(*)來引用該地址所代表的存儲單元。即利用指針變量,提供對變量的一種間接訪問形式。(1) 通過指針或地址引用一個存儲單元 在賦值號右邊由“*”運算符和指針變量組成的表達式,代表指針所

13、指存儲單元的內容。如代碼:int i=8,j,*ip ; ip = &i; j = *ip; 第二條語句是把變量i的地址賦給了指針變量ip,第三條語句是把指針變量ip所指向的變量i存儲單元的值8賦給變量j。上述賦值等價于: j = i;“*”號在這里是一個“間接運算符”,它為單目運算符,與運算對象自右至左結合,且運算對象必須為一個地址對象。例如: j=*&i ; 該語句中“&”運算符求出變量i的地址,“*”運算符取變量i地址中的值8賦給變量j。例如: int *p , k=0 ; p=&k ; *p=150 ;以上第三條語句是把整數150存入變量k中。 *p=*p +1 ; 或 *p+=1 ;

14、 以上語句是獲取指針變量p所指向的存儲單元k中的值150,然后加1再放入指針變量p所指向的存儲單元k中,此時變量k中存放的數值為151。(b)在賦值號左邊由“*”和指針變量組成的 表達式,代表指針所指的存儲單元【例6.1】說明指針變量與它所指變量之間關系的示意程序#include int main() int k; /一個整型變量 int *kPtr; /一個整型指針變量 k = 7; kPtr = &k;/使kPtr指向變量k。 printf(k的地址是 %xnkPtr的值是 %x,&k, kPtr); printf(nk的值是 %dn*kPtr的值是 %d, k ,*kPtr); prin

15、tf(n以下表明運算符*和&是互逆的n&*kPtr = %xn*&kPtr = %xn,&*kPtr,*&kPtr); return 0;k的地址是 12ff7ckPtr的值是 12ff7ck的值是 7*kPtr的值是 7以下表明運算符 * 和 & 是互逆的:&*kPtr = 12ff7c*&kPtr = 12ff7c輸出結果:kPtr&kk7記住對變量的兩種訪問方式:圖6.620008地址: 8000 (&p)2000(&a)指針變量p變量aa或*p的值都為8對變量的兩種訪問方式:直接訪問:按變量地址存取變量值間接訪問:通過存放變量地址的變量去訪問變量(1)當定義局部指針變量時,如果未給它指

16、定初值,則它的值是不確定的。程序在使用它們時,應首先給它們賦值,讓指針變量確定指向某個變量。例如: short *pa; 表示只是定義了一個指針,它還沒有對象。 例如:printf(%dn, *pa);表示訪問非法,將是致命的錯誤,也是初學者易犯的錯誤。為正確理解和使用指針變量,必須注意以下幾點:以下語句正確:short a=3, *pa=&a; *pa = a + 6; /a=a+6(2) 指針變量只能取變量的地址值 不能將任何其他非地址值賦給指針變量。例如:int i, *ip = &i; /ip= i; *ip = i; 通過某個指向變量i的指針變量ip間接引用變量i與直接按變量名i引用

17、變量i,效果是相同的,凡能直接按變量名可引用的地方,也可以用指向它的某個指針變量間接引用它。例如,有,則凡變量i能使用的地方,*ip一樣能用。(3)單目運算符*、&、+和-是從右向左結合的。注意分清運算對象是指針變量、還是指針變量所指對象。例如,有變量定義 int i=200, j, *ip = &i ;代碼 j = +*ip;/j=? 先是*ip,間接引用ip所指向的變量(變量i),然后對變量i的自增運算,并將運算結果賦值給變量j。 +*ip,+(*ip) 表示ip指向的元素值加1。ip+,ip+=1; ip指向下一個元素。*ip+, *(ip+) 先取*ip,再使ip加1。*ip- ,*(

18、ip-) 先取*ip,再使ip減1。*(-ip) ; 先使ip減1,再取*ip。*(+ip); 先使ip加1,再取*ip。 由于”+”在指針變量ip的前面,屬于前置運算,出現在表達式中時遵循“先加后用”的使用規則.例如: j = *ip+; 或 j=*(ip+); 因為“*”運算符和“+”運算符同優先級,而結合方向為“自右至左”(右結合性),即它相當于*(ip+)。而“+”在指針變量ip的后面,屬于后置運算,出現在表達式中時遵循“先用后加”的使用規則. 即表達式*ip+的值與*ip相同,并在求出表達式值的同時,ip增加了1個單位。相當于代碼 j = *ip; ip+;經上述表達式計算后,ip不

19、再指向變量j。 這種情況常用在指針指向數組元素的情況,在引用數組某元素之后,自動指向數組的下一個元素。代碼 j = (*ip)+ ;則是先間接引用ip所指向的變量,取這個變量的值賦值給j,并讓該變量自增。指針變量的引用小結&a表示變量a的地址;假設&a的地址為:2000,a=8;p指針變量p的值,p=&a*p表示指針變量p指向的變量*p=a=8*&a相當于*(&a),有*(&a)*pa=8&*p相當于&(*p),有&*p=&(*p)=&a=2000&p表示指針變量p的地址,若有&p=8000*&p相當于*(&p),有*(&p)=2000&*a寫法有誤,因* 后只能接指針變量假設: int a=

20、8,*p=&a;6.2 指向數組元素的指針數組在內存中占用連續的存儲空間,數組名代表的是數組的首地址。可定義一個指針變量,通過賦值或函數調用參數傳遞的方式,把數組名或數組的第1個元素的地址賦值給該指針變量,該指針變量就指向了該數組首元素。當一個指針指向數組首元素后,對數組所有元素的訪問,既可以使用數組下標,也可以使用指針。7654321pq例如:int a7, *p,*q; p=a;表示:把a0元素的地址賦給指針變量p,即p是指向數組a的首地址。 q = &a3 ;表示:把a1元素的地址賦給指針變量 p,即p是指向數組a的下標為3的元素的指針。好處:1.為引用數組元素提供了一種新的途徑;2.比

21、用下標引用數組元素更靈活和簡潔,因為指針有一定的運算能力。#include void main() short a=1,2,3,4,5,6,7; short n,*p; /*p=&a0; n=sizeof(a)/sizeof(a0); for(p=a;pa+n;p+) printf(%4d,*p); printf(n);例如:12345672000200220042006200820102012p執行p+后pp循環結束使用指針時,應盡量避免指針訪問越界。在上例循環執行后,p已經越過數組的范圍,如圖所示,這時它所指向的單元的值是不確定的,但編譯器不能發現該問題,避免指針訪問越界是程序員自己的責任

22、。 在定義的同時為指針變量賦初值例1:inta10;int*p = &a0; int*q = &a8; 例2:int b25;int *p=&b00; int *q=&b13; 圖6.7對指向數組元素的指針允許作有限的運算:例如: int *p, *q, a10; p = &a1; q = &a5;(1)當兩個指針指向同一個數組的元素時,這兩個指針可以作關系比較( , =, != )。若 p=q 表示p,q指向數組的同一個元素; pq 表示p所指向的數組元素的下標大于q所指向的數組元素的下標。 若兩個指針要做減法運算,要求這兩個指針必須指向同一個數組,運算的結果是它們所指向數組元素下標相差的整

23、數.p-q; 結果為整數-4q-p; 結果為整數4pq(2) 指向數組元素的指針可與整數進行加減運算,使指針指針指向在數組元素之間前后移動 由于數組元素在內存中順序連續存放,數組名代表的是數組的首地址。因此表達式a+1為a1的地址,a+2為a2的地址。 當用一個指針指向數組首元素后,對數組所有元素的訪問,既可以使用數組下標,也可以使用指針. 若指針 p = &a0; 則表達式 p+n 的值為 an的地址。或者說,p+n的值為指向an的指針值。注意: 在使用指針過程中,通過移動指針(p)來實現對不同數據單元的訪問操作。 p+1不是將p的值和1簡單地相加。對不同的類型,移動的單位長度不同。單位長度

24、一般是指針所指向的變量的數據類型長度。 如果數組元素是短整型(short),p+1表示p的地址加2;如果數組元素是實型(float),或整型(int) ,p+1表示p的地址加4;如果數組元素是字符型,p+1表示p的地址加1。(3) 引用數組元素的方法(1)當指針變量p指向一維數組a的第一個元素a0 ,如p=&a0;數組的第i+1個數組元素ai有如下寫法:下標法,如ai數組名,如 *(a+i)表示ai。指針變量,如 *(p+i),或pi。 圖6.8同理:ai的地址也對應有如下寫法: &ai , &pi, a+i , (p+i)例如: int a100, b100, *p, *q; for(p=a

25、;pa+100;)scanf(%d,p+);/*利用指針遍歷數組,輸入數組的全部元素*/ for(p=a;p=&a99;p+) printf(*p = %dt, *p);/*利用指針遍歷數組,輸出數組的全部元素*/ printf(n); for(p=a,q=b;pa+100;)*q+=*p+;/* 利用指針將已知數組復制到另一個數組*/ (2) 指向一維數組非首元素的指針假設指針p指向一維數組a的第3個元素a2,則:如右圖所示。p1: 使p指向下一個元素a3。(p+1)p-1: 使p指向前一個元素a1。(p-1)同理:pi: 使p指向元素a2+i。(p+i)d) p-i:使p指向元素a2-i

26、(p-i)由上可知:當指針變量p指向一維數組a的第n個元素an以后,數組的第i個數組元素ai有如下寫法:ai ,pni,*(a+i),*(p+ni)如:p=&a4;則pi引用的是a4+i,則: p-2,引用的是a2.圖6.9 在實際應用中,一般是定義指向一維數組“首元素”的指針來對數組進行操作。同理:ai的地址也對應有如下寫法: &ai , &pni, a+i , (p+ni)再次提醒注意:定義指向數組元素的指針變量,其指針類型應與數組元素類型相同。例如定義:floata10; int*p = &a0; 中的第二個語句就是錯誤的,因為定義的指針p是一個整型指針,它是指向整型數據的,而數組元素是

27、實型數據,類型不相同。所以使用時千萬要小心哦。用數組名與指針的區別:使用指針訪問數組元素,應注意的問題是: 若指針p指向數組a首元素,雖然p+i與a+i、*(p+i)與*(a+i)意義相同,但仍應注意p與a的區別。 a代表數組的首地址,是常量,不變的,例如語句for(p=a; a(p+10); a+) printf(%d, *a);企圖通過語句a+來改變a的值是不合法的。 p是一個指針變量,可指向數組中的任何元素,例如p+,故要注意指針變量的當前值。 通過指針引用二維數組元素舉例 當p指向二維數組的首元素后,p+1將指向數組第2個元素,p+2將指向數組第3個元素,依此類推。例如定義:int a

28、25;int *p=&a00;后,p指向二維數組a的首元素,如圖6.10所示。若將數組元素用p表示出來,則如圖6.11所示。a00a01a02a03a03a10a11a12a13a13*p*(p+1)*(p+2)*(p+3)*(p+4)*(p+5)*(p+6)*(p+7)*(p+8)*(p+9)圖6.11用指針變量p表示的二維數組元素pp+1p+2p+3p+4p+5p+6p+7p+8p+9圖6.10對圖進行觀察,可知:aij的地址為p+i*5+j,aij可表示為*(p+i*5+j)。由此推出一般性的結論如下:假設指針變量p已經指向共有M行N列的數組A的首元素,則 aij的地址為p+i*N+j,

29、 aij可表示為*(p+i*N+j)。 其中 0iM(行數), 0jN(列數)。ij程序清單如下:#include #define M 2#define N 4void main() int aMN, max, i, j; int *p=&a00;/*通過賦初值使p指向a數組首元素*/ printf(請輸入數組中各元素的值:n);for(i=0;iM;i+) for(j=0;jN;j+)scanf(%d,p+);/*通過p+依次引用各數組元素地址*/例:用指針法求二維數組的最大值。max=a00;/*首先認為第一元素的值是最大值*/p=&a00; /*通過賦值使p指向a數組首元素*/for(i

30、=0;iM;i+) for(j=0;jN;j+) if(max*(p+i*N+j) /*max與各數組元素進行比較*/ max=*(p+i*N+j);/*max總是存放比較后的大者*/printf(數組中的最大值為:%dn,max);/*輸出最大值*/* 12 3 45 6 8 100 56 78*/指針與字符串 當字符串存放在數組中,其處理方法與一維數組的處理方法基本一致,可以先定義一個字符類型的指針變量,通過賦初值或賦值的方式讓指針變量指向字符數組首元素。然后就可以使用這個指針變量處理單個字符,也可以用它一次性地處理整個字符串,此種方法不再詳細討論。本節主要討論利用字符類型的指針變量處理字

31、符串常量的方法。 void main() char *string=I love China! ; printf(%sn,string); (2) 給指針變量賦值。例如: char *string; string=I love China! ;IloveChina!0string將字符類型的指針變量指向字符串有兩種方法:(1) 在定義的同時給指針變量賦初值。例如: 上述兩種方式,實際上都是把字符串的第一個字符string的地址賦給指針變量1.使指針變量指向字符串的方法 2指向字符串常量的指針變量的使用(1) 把字符串當作整體來處理這種方式通常用在字符串的的輸入和輸出中,格式如下:1. 輸入字符

32、串:(a) scanf(%s,指針變量);(b) gets(指針變量);2. 輸出字符串:(a) printf(%s,指針變量);(b) puts(指針變量);(2) 處理字符串中的單個字符若指針變量已經指向了字符串常量,則用指針變量表示的第i個字符為:*(指針變量+i)3.使用字符指針變量與字符數組的區別(1) 存儲內容不同。 字符指針變量本身是一個變量,用于存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續的內存空間中并以0作為串的結束。字符數組是由若干個數組元素組成的,每個元素中放一個字符。(2) 賦值方式不同。對字符指針變量,可采用下面方法賦值:如:char *s;s=I

33、 love China! ; 而對字符數組只能對各個元素逐個賦值,不能用以下辦法對字符數組賦值:char s20;s=I love China! ; (3) 指針變量的值可以改變;而數組名代表的是該數組的首地址,是常量,它的值是不能改變的。例#include void main() char *p=Gold medal; p=p+5; printf(%s,p);例#include void main() char a=Gold medal; a=a+5; printf(%s,a);(4) 內存分配有區別:如果定義了一個字符數組,在編譯時自動為它分配內存單元,它有確定的地址。指針在定義時,若沒有

34、人為的給它分配內存或使它指向確定的內存單元,則該指針指向的內存位置是不確定的。(這點也是初學者常犯的錯誤,請通過后面的課深入掌握)#include void main()char p10;scanf(%s,p);printf(%s, p);#include void main()char *p;scanf(%s,p);printf(%s, p);? 前面說過,當一個指針變量在未取得確定地址前使用是危險的,容易引起錯誤。但是對指針變量直接賦值是可以的。因為C系統對指針變量賦值時要給以確定的地址。因此, char *cp1, *cp2 = I am a string;/*用字符串常量初始化字符指針

35、變量或者*/cp1 = Another string; /*用字符串常量賦值給字符指針變量*/都是合法的。 使字符指針變量cp2指向字符串常量 I am a string的第一個字符I,使cp1指向字符串常量Another string 的第一個字符A。以后就可通過cp2或cp1分別訪問這兩個字符串常量中的其它字符。例如,*cp2或cp20就是I,*(cp1+3)或cp13就是字符t。 要特別強調指出,企圖通過指針變量修改存于常量區中的字符串常量是不允許的。例如: 將cp20中I改成y,將會出現致命的錯誤.例如,調用庫函數strlen()求字符串常量的長度: strlen(I am a str

36、ing.)該函數調用的結果是14,表示這個字符串常量由14個有效字符組成。如果s是一個字符數組,其中已存有字符串,cp是一個字符指針變量,它指向某個字符串的首字符:char s = I am a string., *cp = Another string.;則代碼: printf(%sn,s);輸出存于字符數組s中的字符串。而代碼: printf(%sn,cp);輸出字符指針變量cp所指向的字符串。 【例6.2】字符串復制:實現將字符數組s2中的字符串復制到字符數組s1中。 根據前面介紹的知識,用指針指向數組元素后,訪問某個數組元素時有四種方法,我們因此可以寫出四種實現代碼。#include

37、void main( )int i=0;char s120,s220=How are you!;for(;(s1i=s2i) !=0;i+);puts(s1);(1)用數組名下標來訪問數組元素。 由于字符串結束符0的值為0,上述測試當前復制字符是不是字符串結束符的代碼中,“!=0”是多余的,字符串復制更簡潔的寫法是: for(;s1i=s2i;i+);也可用:while(s1i=s2i)i+;(2)用指針移位或指針名下標來訪問數組元素。#include void main( )int i=0;char s120,s220=How are you!;char *from=s2,*to=s1; w

38、hile(*to+=*from+); /*whie(toi=fromi)i+;指針名接下標*/puts(s1); (3)用指針名加偏移量計算出的地址來訪問數組元素#include void main( )int i=0;char s120,s220=How are you!;char *to=s1,*from=s2;while(*(to+i)=*(from+i)i+;puts(s1);(4)用數組名加偏移量計算出的地址來訪問數組元素#include void main( )int i=0;char s120,s220=How are you!;while(*(s1+i)=*(s2+i)i+;p

39、uts(s1);【例6.3】將字符串s中的某個字符去掉,假設要去掉的字符與字符變量c中的字符相同。 可以采用邊考察字符,邊復制不同字符來實現。現引入字符指針p和q,其中p指向當前正要考察的字符,若它所指的字符與c中的字符不同,則將它復制到新字符串中。否則,該字符不被復制,即從新的字符串中去掉了;q指向下一個用于存儲復制字符的存儲位置。每次復制一個字符后,q增加1。每次考察了一個字符后,p就增1。 for(p = q = s; *p; p+) if (*p != c) *q+ = *p; /* 復制 */ *q = 0; /* 重新構成字符串 */6.3指針與函數指針與函數的結合使編程更為靈活。指針可以用作函數的參數(傳遞地址值)函數也可以返回一個指針類型的值,甚至可以定義指向函數的指針。 1函數形參為指針,實參為地址表達式 因為地址表達式的值是一個地址值,所以函數調用時,實參地址表達式傳遞給形參指針變量的值是地址,故參數傳遞后實參與對應的形參指向同一個單元,函數體內對形參的任

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論