版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、2020/8/8,1,第8章 指針和引用,2020/8/8,2,8.1指針和指針變量,指針的概念,在程序運(yùn)行時,任何一個變量在內(nèi)存中都要為其分配存儲單元,存儲單元按地址編號。變量占用內(nèi)存單元的第一個字節(jié)的地址就是變量的指針。在程序運(yùn)行過程中,可以將變量的指針(地址)賦給一種特殊類型的變量指針類型變量。,2020/8/8,3,指針變量說明方法 數(shù)據(jù)類型 *變量名1,*變量名2 , ,*變量名n; 如:int *p1,*p2; /說明了兩個整型指針變量p1,p2 float *q1,*q2,*q3; /說明了三個實(shí)型指針變量q1,q2,q3 double *s; /說明了一個雙精度型指針變量s 其
2、中:變量名前的“*”為一標(biāo)志,指出該類型變量是指針類型變量,簡稱為指針變量.,2020/8/8,4,有關(guān)指針的特殊運(yùn)算 “*” 是取內(nèi)容運(yùn)算符,用來讀取它所指向的內(nèi)存中的值。 “ pc= /將q賦給p,2020/8/8,7,例8-1:指針的賦值運(yùn)算和算術(shù)運(yùn)算。,#include void main(void) int a1=1,a2=2; int *p1,*p2,*p3; float *fp1,*fp2; float b1=23.5,b2=55.6; p1= /A將變量a的地址賦給p1,稱指針變量p1指向變量a1,2020/8/8,8,p2=p1; /B同類型的指針變量之間的賦值 p3= ,2
3、020/8/8,9,程序執(zhí)行后輸出: *p1=1 *p2=1 *p3=2 p1=0 x0065FDDC p3=0 x0065FDD8 *fp1=23.5 *fp2=55.6,指針變量的訪問有兩種方法: 一是訪問指針變量的值,另一是訪問指針變量所指向的內(nèi)存單元中的數(shù)據(jù),這種訪問稱為訪問指針的內(nèi)容。,2020/8/8,10,注:1. C+中可將0賦給一指針變量,意為初始化,其值 為“空”。即該指針變量不指向任一內(nèi)存單元,也就是不指向任一變量。如: #include void main(void) int *pt; pt=0; *pt=100;/出錯,因pt不指向任一內(nèi)存單元, /因而不允許給pt所
4、指向的內(nèi)存單元賦值。 cout*ptn; 2. 不同類型的指針變量間可強(qiáng)制轉(zhuǎn)換后賦值,但通常 沒有意義。,2020/8/8,11,如:#include void main(void) int i=100,*p1; float x=2.5,*p3; p1= char name4; ; student *pst;,(2)指針的算術(shù)運(yùn)算,pxn: pxnsizeof(T),px-py: ( px-py) / sizeof(T),px+n, px-n 將指針從當(dāng)前位置向前或向后移動n個數(shù)據(jù)單位,而不是n個字節(jié)。 這取決于指針?biāo)赶虻臄?shù)據(jù)類型(T)。,px-py求出的是兩指針位置之間的數(shù)據(jù)個數(shù),而不是地
5、址差。,2020/8/8,13,例8-2:指針變量的“+”和“-”運(yùn)算。,#include void main(void) int a10=100,200,300,400,500; int i=10, j=20,*p1= /p1指向變量j,輸出*p1的值為20,2020/8/8,14,p1+; /p1加1,實(shí)際運(yùn)算加4,因為一個整數(shù)型變量占四個字節(jié) cout*p1=*p1tp1=(int)p1n; cout*p2=*p2tp2=(int)p2n; p2+; /開始時指向a的第0個元素,加1后指向a的第一個元素 cout*p2=*p2tp2=(int)p2n; cout*pc1=*pc1 pc1
6、=(int)pc1 n; ,2020/8/8,15,程序執(zhí)行后輸出: *p1=20 p1=6618552 *p1=10 p1=6618556 *p2=100 p2=6618576 *p2=200 p2=6618580 *pc1=a pc1=6618568,2020/8/8,16,注:C+中,同一個說明語句中所說明的變量均分配在同一個連續(xù)的存儲空間,VC+按從右到左的順序來分配。一般來說,分配的順序隨編譯器不同而不同。,例8-3:指針變量加一常數(shù)。,#include void main(void) int a10=100,200,300,400,500; int *p2= ,2020/8/8,1
7、7,執(zhí)行后輸出:*p2=100 p2=6618576 *p2=500 p2=6618592 *p2=300 p2=6618584,2020/8/8,18,(3)指針的關(guān)系運(yùn)算 指對兩個相同類型的指針的運(yùn)算,如pxpy,當(dāng)px所指位置在py之前時,表達(dá)式的值為1,否則為0。 px= =0,px!=0用來判斷px是否為空指針。 注:不同類型的指針以及指針和一般整數(shù)間的關(guān)系運(yùn)算是無意義的。,例8-4:指針變量的關(guān)系運(yùn)算。,#include void main(void) int a5=100,200,300,400,500; int *p2,*p1;,2020/8/8,19,執(zhí)行后輸出:100 20
8、0 300 400 500 元素之和為:1500,for(p2= ,2020/8/8,20,注:幾種運(yùn)算符的混合運(yùn)算及其優(yōu)先級。 (1)指針運(yùn)算符“*”與取地址運(yùn)算符“ for (int i=0; i4; i+) cout *(a+ i )= *(a+i) , a i = ai ; ,指針與數(shù)組的差異: 指針是地址變量,可任意改變它的值; 數(shù)組名是地址常量,其值不能改變。,結(jié)果: *(a+0)=11, a0=11, *(a+1)=22, a1=22, *(a+2)=33, a2=33, *(a+3)=44, a3=44,數(shù)組元素的引用,既可用下標(biāo)法,也可用指針法。使用下標(biāo)法,直觀;而使用指針法
9、,能使目標(biāo)程序占用內(nèi)存少、運(yùn)行速度快。,2020/8/8,24,通過指針變量操作一維數(shù)組,當(dāng)指針變量(p)指向數(shù)組中的某個元素時,指針變量中存放的是該元素的地址,而*p是該元素的值。 如: int a10=1,3,5,7,9,11,13,15,17,19,*p1,*p2; p1=a; /等同于p1= / 先使p指向a0, /把a(bǔ)0的值賦給b后,p指向a1 p=a+1,b=*+p; / 先使p指向a1, /p后移指向a2,把a(bǔ)2的值賦給b p=a,b=(*p)+; / 把a(bǔ)0賦給b后, /p所指元素a0的值自增,即a0+=1 p=a,b=*(p+);/ 等同于p=a,b=*p+; p= / p所
10、指元素的值自增(a2+=1)后,賦給b,2020/8/8,27,當(dāng)指針變量指向數(shù)組時,用指針變量操作數(shù)組的基本方法有2種: (1)以指針變量名代替數(shù)組名完成數(shù)組的操作; (2)直接通過指針變量完成對數(shù)組的操作。 這2種方法的區(qū)別在于:第1種方法,指針變量所指的位置不變,指針變量仍指向原來的地方;第2種方法,指針變量所指的位置將發(fā)生變化。,2020/8/8,28,例8-5 通過指針變量輸出一維數(shù)組各元素的值及其地址。 算法分析: 通過循環(huán)語句遍歷數(shù)組,在遍歷的過程中以多種形式輸出各元素的值及其地址。,2020/8/8,29,# include void main(void) int a3=1,3
11、,5,*p1=a,*p2=a; for (int i=0; i3; i+) coutaitp1itt *(p1+i)t *p2n; cout地址t ,2020/8/8,30,需要指出的是,上例中的指針變量是指向首元素的,當(dāng)指針變量指向其它元素時,雖然也可以用指針變量來操作數(shù)組,但指針變量名已不能代替原數(shù)組名,它所代替的是指針變量所指位置開始的數(shù)組。 一般地,當(dāng)指針變量p 指向數(shù)組a 中下標(biāo)為 j的元素時(p=a+j或p= int n,t,*p1,*p2; coutn; p1=a; /p1指向數(shù)組的第1個元素 p2=a+10-n;/p2指向數(shù)組的倒數(shù)第n個元素 for (int i=0; in;
12、 i+) t=p1i; /方法一:以指針變量名代替數(shù)組名 p1i=p2i; p2i=t; ,2020/8/8,33,/*for (int i=0; in; i+,p1+,p2+) /方法二:直接使用指針變量 t=*p1; *p1=*p2; *p2=t; */ cout對調(diào)后的序列為:n; for(i=0;i10;i+) coutait; /輸出對調(diào)后數(shù)組 coutn; ,2020/8/8,34,通過指針變量操作字符數(shù)組,1. 用字符型指針變量操作字符數(shù)組(字符串)的基本方法。 (1) 可以將一個字符數(shù)組的首地址(數(shù)組名)賦給一個字符類型的指針變量; (2) 可以將一個字符串賦給字符型指針變量(
13、實(shí)質(zhì)上是先在內(nèi)存中存放一個字符串,然后再把該字符串的首地址賦給該指針變量);,2020/8/8,35,(3) 字符串處理函數(shù)中,可以用字符型指針變量代替字符串; (4) 可通過字符型指針變量實(shí)現(xiàn)對該指針變量所指的內(nèi)存空間進(jìn)行輸入、輸出處理,輸入字符型指針變量實(shí)質(zhì)上是把輸入的內(nèi)容存放到該指針變量所指的內(nèi)存區(qū)域,輸出字符型指針變量則是從該指針變量所指位置開始輸出對應(yīng)內(nèi)存中的內(nèi)容,直至字符串結(jié)束標(biāo)志。,2020/8/8,36,如:char s50=“asdfgh”,*s1=s,*s2,*s3= “C+ Program !”, *s4; s2 =“This is a string !”; / s3是初
14、始化,s2是先定義后賦值 strcpy(s,s2); / A行,s中內(nèi)容為“This is a string !” s3=s+2; cins3; / B行,輸入字符個數(shù)不能超過47個(不含結(jié)束標(biāo)志) /若輸入“123”,則s中的內(nèi)容變?yōu)椤癟h123” couts2;/ D行,編譯時不報錯,執(zhí)行時報內(nèi)存引用錯誤 cins4; / E行,編譯時警告性錯誤,執(zhí)行時報內(nèi)存引用錯誤,2020/8/8,37,2. 用字符型指針變量操作字符數(shù)組(字符串)時應(yīng)注意的問題。 (1) 使用前,字符型指針變量所指的區(qū)域必須確定; (2) 注意指針變量所指的區(qū)域大小必須滿足要求; (3) 注意字符型指針變量與字符數(shù)組
15、的差異; (4) 注意字符串的結(jié)束標(biāo)志。,2020/8/8,38,例8-7 通過字符型指針變量拼接字符數(shù)組,如把“abcd”和“1234” 拼接成“abcd1234”。 算法分析: (1) 先使指針變量ptr1和ptr2分別指向數(shù)組str1和str2(B行); (2) 移動ptr1到str1的結(jié)束標(biāo)志處(C行); (3) 通過ptr2對str2遍歷,在遍歷的過程中,把ptr2所指的字符逐一地對應(yīng)地賦給ptr1所指的字符(D處循環(huán)); (4) 拼接完成后,給str1添加字符串的結(jié)束標(biāo)志。,2020/8/8,39,#include void main() char str140,str220,*p
16、tr1,*ptr2; cout請輸入字符串1:; cin.getline(str1,20);/A 輸入字符串 cout請輸入字符串2:; cin.getline(str2,20); ptr1=str1; ptr2=str2;/B 初始化指針變量 while(*+ptr1); /C ptr1定位到字符串1結(jié)束標(biāo)志處 while(*ptr2) /D 字符串2拼接到字符串1后 *ptr1=*ptr2; ptr1+,ptr2+; ,2020/8/8,40,*ptr1=0; /E 拼接完后置字符串結(jié)束符0 cout拼接后的字符串是:; coutstr1endl; 調(diào)試與運(yùn)行: 請輸入字符串1:abcd
17、請輸入字符串2:1234 拼接后的字符串是:abcd1234,2020/8/8,41,8.3指針數(shù)組,指針數(shù)組的定義,如果一個數(shù)組的所有元素均是指針,則稱該數(shù)組為指針數(shù)組。其定義格式如下: 類型 *數(shù)組名數(shù)組大小; 如:char *p10 ; /定義了一個字符型的指針數(shù)組,可以存放10個字符型的指針(地址),2020/8/8,42,通過指針數(shù)組操作一維數(shù)組和二維數(shù)組,可以把一維數(shù)組每個元素的地址保存在指針數(shù)組中,也可以把二維數(shù)組每行元素的地址保存在指針數(shù)組中,然后通過指針數(shù)組來操作一維和二維數(shù)組。,2020/8/8,43,例8-8 通過指針數(shù)組輸出一維數(shù)組和二維數(shù)組。 算法分析: (1)把一維
18、數(shù)組a中每個元素的地址依次保存在指針數(shù)組p中; (2)把p中地址對應(yīng)的元素一一輸出; (3)類似地,也可以用指針數(shù)組來操作二維數(shù)組。,2020/8/8,44,#include void main() int a5=1,2,3,4,5,*p5; for(int i=0;i5;i+) /A 將各元素地址保存在指針數(shù)組中 pi=,2020/8/8,45,int b56=1,2,3,4,5,6,7,8,9,10,11,12,13; for(i=0;i5;i+) pi=bi; /E 操作二維數(shù)組 cout二維數(shù)組為:n; for(i=0;i5;i+) for(int j=0;j6;j+) coutpij
19、t;/F coutn; ,2020/8/8,46,通過指針數(shù)組和指向指針的指針變量操作系列字符串,設(shè)有二維字符數(shù)組定義如下: char s510=“String1”,“String2”,“String3”,“String4”,“String5”; 數(shù)組s 中的每個元素s0、s1、s2、s3和s4都是一個一維的字符數(shù)組(字符串),也是一個字符型的指針,可以把它們存放到一個指針數(shù)組中。,2020/8/8,47,如: char *str5=s0,s1,s2,s3,s4; 定義指針變量p,char *p=str;p 是指向指針的指針變量 。通過下列語句可以方便地實(shí)現(xiàn)二維字符數(shù)組的輸出: for(int
20、 i=0;i5;i+) cout*p+n;,2020/8/8,48,*p= stri,圖3-1 用指針數(shù)組和二級指針處理系列字符串,2020/8/8,49,例8-9 設(shè)計一個程序,實(shí)現(xiàn)系列字符串按字母順序排序。,2020/8/8,50,算法分析: (1) 把系列字符串保存在指針數(shù)組中; (2) 用直接選擇排序法對系列字符串進(jìn)行排序; (3) 直接選擇排序法: 第1次循環(huán)(i=0),把最小(升序)或最大(降序)的數(shù)據(jù)放在第1位;第2次循環(huán)(i=1),把次小或次大的數(shù)據(jù)放在第2位;以此類推,直到所有數(shù)據(jù)排序結(jié)束。,2020/8/8,51,#include #include void main()
21、char *week =Monday,Tuesday, Wednesday,Thursday,Friday, Saturday,Sunday; char *p1,*p2=week; int i,j;,2020/8/8,52,for(i=0;i0) p1=weeki; weeki=weekj; weekj=p1; cout按字母順序排序為:n; for(i=0;i7;i+) cout*p2+n; /輸出排序后各字符串 ,2020/8/8,53,8.4指針和函數(shù),指針作為函數(shù)的參數(shù),將指針作為函數(shù)的參數(shù)時,傳遞給函數(shù)的是某一個變量的地址,稱為地址傳遞。 指針值和指針?biāo)赶虻臄?shù)據(jù)均可作為函數(shù)的輸入?yún)?/p>
22、數(shù)。也可將指針?biāo)赶虻臄?shù)據(jù)作為函數(shù)的輸出參數(shù)。,例8-10:實(shí)現(xiàn)兩個數(shù)據(jù)的交換。,2020/8/8,54,#include void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; void main(void) int a,b; coutab; coutna=a,b=bn; swap(,執(zhí)行后輸出:a=100,b=200 a=200,b=100,2020/8/8,55,2020/8/8,56,若將該例中的swap()函數(shù)改為: void swap1(int x,int y) /指針參數(shù)改為整型變量 int t; t=x
23、;x=y;y=t; 主函數(shù)中swap( for(i=0;i*(p+j) temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp; ,2020/8/8,59,void sort2(int *p,int n) int i,j,temp; for(i=0;ipj) temp=pi; pi=pj; pj=temp; ,void sort3(int b,int n) int i,j,temp; for(i=0;ibj) temp=bi; bi=bj; bj=temp; ,2020/8/8,60,void main(void) int a6=4,67,3,45,34,78,*poi
24、nt; int b6=4,67,3,45,34,78; int c6=4,67,3,45,34,78; point=c; sort1(a,6); sort2(b,6); sort3(point,6); for(point=a;pointa+6;) cout*point+t; coutn; for(point=b;pointb+6;) cout*point+t; coutn; for(point=c;pointc+6;)cout*point+t; coutn; ,2020/8/8,61,執(zhí)行后輸出: 3 4 34 45 67 78 3 4 34 45 67 78 3 4 34 45 67 78,
25、2020/8/8,62,多維數(shù)組作函數(shù)參數(shù)下列三種情況相同: (1)多維數(shù)組作形參,實(shí)參為多維數(shù)組名; (2)將多維數(shù)組作為一維數(shù)組處理,一維數(shù)組或一級指針作一個形參,另一形參為數(shù)組元素的個數(shù),實(shí)參為數(shù)組的起始地址;,2020/8/8,63,例8-12:設(shè)計一程序,求二維數(shù)組的平均值。,#include /average1、average2作用相同 float average1(float *p,int n) /將二維數(shù)組作一維數(shù)組處理,第一個參數(shù)為 /一級指針,對應(yīng)第0行第0列元素的地址,第 /二個參數(shù)為二維數(shù)組中元素的個數(shù) float sum=0; int i; for(i=0;in;i+
26、)sum+=*p+; return sum/n; ,2020/8/8,64,float average2(float p4,int n) /第一個參數(shù)為二維數(shù)組,對應(yīng)的實(shí)參為數(shù)組名 /score,第二個參數(shù)為二維數(shù)組的行數(shù) float sum=0; int i,j; for(i=0;in;i+) for(j=0;j4;j+)sum+=pij; return sum/(n*4); ,2020/8/8,65,void main(void) float score34=65,67,70,60, 80,87,90,81,90,99,100,98; cout平均值= average1(*score,12
27、)n; cout平均值= average2(score,3)n; ,2020/8/8,66,執(zhí)行后輸出:平均值=82.25 平均值=82.25 平均值=82.25,2020/8/8,67,函數(shù)返回值為指針的函數(shù),用return可返回一個值或不返回值,但需返回多于一個值時,要通過函數(shù)的參數(shù)來實(shí)現(xiàn)。另外還可返回一個指針,指針可指向任一已定義的類型數(shù)據(jù)。,一般定義格式: 類型符 *函數(shù)名(參數(shù)表) 如:int *fp(char); /函數(shù)fp返回一個指向整型的指針,2020/8/8,68,例8-13:設(shè)計一程序,將輸入的字符串按逆序輸出。,分析:用字符型指針變量p1指向原字符串的第0個字符,用指針變
28、量p2指向最后一個字符,將p1和p2所指的字符交換,p1向后移一位,p2向前移一位,繼續(xù)。,2020/8/8,69,#include char *flip(char *ptr) char *p1,*p2,temp; p1=p2=ptr; /使p1和p2指向字符串的第0個位置 while(*p2+); /執(zhí)行后p2指向字符串結(jié)束字符后面一個位置 p2-=2; /使p2指向字符串的最后一個字符的位置 while(p1p2) /將p1所指的與p2所指的交 /換,并使p1向后移一位,p2向前移一位 temp=*p2;*p2-=*p1; *p1+=temp; return ptr; ,2020/8/8,
29、70,void main(void) char str200; cout輸入一個字符串:; cin.getline(str,199); coutstrn; coutflip(str)n; ,若輸入字符串: Computer Department. 則輸出: .tnemtrapeD retupmoC,2020/8/8,71,例8-14:輸入兩個字符串,設(shè)計一程序,把這兩個字符串拼成一個新的字符串,然后輸出這三個字符串,字符拷貝和拼接的函數(shù)自己設(shè)計。,2020/8/8,72,#include char *copy(char *to,char *from) char *p=to; while(*to
30、+=*from+); return p; char *stringcat(char *to,char *from) char *p=to; while(*to+); to-; while(*to+=*from+); return p; ,2020/8/8,73,void main(void) char s1100,s2100,s3200; cout輸入第一個字符串s1=; cin.getline(s1,99); cout輸入第二個字符串s2=; cin.getline(s2,99); copy(s3,s1); cout將s1拷貝到s3中后,s3= s3n; cout將s2拼接到s1后的字符串為
31、: stringcat(s3,s2)n; ,2020/8/8,74,若輸入字符串: C+ Program和ming Socre. 則輸出: s1=C+ Program s2=ming Score. 將s1拷貝到s3中后,s3=C+Program 將s2拼接到s1后的字符串為: C+Programming Score.,2020/8/8,75,指向函數(shù)的指針,雖然函數(shù)不是變量,仍占存儲空間,此空間的首地址函數(shù)入口地址稱為函數(shù)的指針,若指針變量的值為一個函數(shù)的入口地址,則稱它為指向函數(shù)的指針變量。 (1)定義格式 存儲類型 數(shù)據(jù)類型 (* 函數(shù)指針名)(參數(shù)表) 如:int (*fp) ( cha
32、r ); /fp為一函數(shù)指針, 此函數(shù)的返回值為int,參數(shù)為char int (*fp)(float,float); / fp為指向int型函數(shù)的指針變量,2020/8/8,76,注意:“*指針變量”外的括號不能缺,否則成了返回指針值的函數(shù)。,(2)賦值 函數(shù)名代表該函數(shù)的入口地址。因此,可用函數(shù)名給指向函數(shù)的指針變量賦值。 指向函數(shù)的指針變量函數(shù)名; 注意:函數(shù)名后不能帶括號和參數(shù),且與該指針變量具有相同的返回值類型和相同參數(shù)(個數(shù)與順序均一致)。,2020/8/8,77,(3)調(diào)用格式 (*函數(shù)指針變量) (實(shí)參表) 或 函數(shù)指針變量 (實(shí)參表),如:float f(float); fl
33、oat (*fp1)(void); float *(*fp2)(float *,float *); float *f2(float *,float *); fp1=f; /錯誤,變量類型不同 fp2=f2; /正確,2020/8/8,78,8.5new和delete運(yùn)算符,C+中的new運(yùn)算符可根據(jù)對象的類型,自動決定其大小,動態(tài)地分配空間,返回的是內(nèi)存地址, 可賦給一個指針, 如: int n; cinn; int *pi; /定義一個指針變量 pi=new intn; /分配內(nèi)存地址給 pi int *pp,a=9; pp= /OK delete p; /OK delete p; /危險!
34、,2020/8/8,83,例8-15:設(shè)計一程序,實(shí)現(xiàn)動態(tài)內(nèi)存空間分配。,#include void main(void) int *p1; float *fp1; char *cp1; p1=new int; /動態(tài)地分配一個存放一個整數(shù)的內(nèi) /存空間,使p1指向該單元,2020/8/8,84,fp1=new float(2.5); /動態(tài)分配一個 /存放實(shí)數(shù)的內(nèi)存空間,并初始化為2.5 cp1=new char; /分配一個存放一個 /字符的內(nèi)存空間,cp1指向該空間 *cp1=A; *p1=25; cout*p1=*p1n; cout*fp1=*fp1n; cout*cp1=*cp1n;
35、 delete p1; /將用new分配的內(nèi)存空間歸還給系統(tǒng) delete fp1; delete cp1; ,2020/8/8,85,執(zhí)行后輸出: *p1=25 *fp1=2.5 *cp=A,2020/8/8,86,使用new和delete運(yùn)算符應(yīng)注意的事項,1. new所分配的存儲空間的初值不確定,使用前應(yīng)初始化。 2. 一般應(yīng)檢驗new分配的空間是否分配成功,若失敗應(yīng)終止程序或作出錯處理。如: float *p; p=new float 1000; if(p= =0) cout“動態(tài)分配內(nèi)存不成功,終止程序的執(zhí)行!n”; exit(3); 3. 動態(tài)分配存放數(shù)組的內(nèi)存空間,或為結(jié)構(gòu)體分配
36、內(nèi)存空間時,不能在分配空間時進(jìn)行初始化。如: int *pi; pi=new int 10(1,2,3,4,5,6,7,8,9); /錯誤,2020/8/8,87,4. 若new運(yùn)算符計算的指針類型與賦值運(yùn)算符左操作數(shù)類型不一致時,要進(jìn)行強(qiáng)制轉(zhuǎn)換。如: float (*p1)10,(*p2)20; p1=new float20; /錯誤。因p1是用于指向二維數(shù)組的指 /針,而new運(yùn)算的結(jié)果為一維數(shù)組的指針 而 p1=(float (*)10)new float10;/正確。進(jìn)行了強(qiáng)制類型轉(zhuǎn)換 或 p1=new float110; /正確。分配二維數(shù)組的內(nèi)存空間 又如: p2=new floa
37、t1020; /正確。分配10行,每行20個元素的二維數(shù)組 int *p3; p3=new int1020; /錯誤 而 p3=(int *)new int1020; /正確 或 p3=new int10*20; /正確,2020/8/8,88,5. 用new分配的內(nèi)存空間指針值應(yīng)保存,以便用delete歸還,否則出錯。如: float *fp,i; fp=new float; *fp=24.5; fp= int 輸出的值為5 。 特別提示:必須是對一個已存在變量的引用。,2020/8/8,92,2、引用舉例 例8-16 引用類型變量運(yùn)算。 要求:掌握引用類型變量的使用方法。,2020/8/8
38、,93,編程實(shí)現(xiàn): #include void main(void) int a=10;/A行 int ,2020/8/8,94,調(diào)試與運(yùn)行: 輸出: a=10 b=10 a=20 b=20 a=30 b=30 說明: 變量與引用類型的變量是同一個變量的兩個不同名字。 對任何一個改變其值,另一個也同時改變。,2020/8/8,95,注:(1)定義引用類型變量時,要初始化。初始化變量類型 要與引用類型變量的類型相同。如: float x; int t=*p1;*p1=*p2;*p2=t; ,2020/8/8,99,void swap2(int ,2020/8/8,100,若輸入x、y的值為300
39、、400,a、b的值為100、200,則輸出: x=400 y=300 a=200 b=100,例8-18 分析以下程序的執(zhí)行結(jié)果。 #include int a=20;/A int fun(int *a, int ,void main(void) int a=10,b=1,c=1;/D coutfun( ,調(diào)試與運(yùn)行: 35 73 74 112 113,2020/8/8,103,8.7簡單鏈表及其應(yīng)用,鏈表概述,鏈表是指將若干個同類型的結(jié)構(gòu)體類型數(shù)據(jù)按一定的原則連接起來。,頭指針,struct node char name20; int age; node *next; ;,2020/8/8
40、,104,鏈表的一般形式,(1)頭指針變量head指向鏈表的首結(jié)點(diǎn)。 (2)每個結(jié)點(diǎn)由2個域組成: 1)數(shù)據(jù)域存儲結(jié)點(diǎn)本身的信息。 2)指針域指向后繼結(jié)點(diǎn)的指針。 (3)尾結(jié)點(diǎn)的指針域置為“NULL(空)”,作為鏈表結(jié)束的標(biāo)志。,2020/8/8,105,對鏈表的基本操作有:創(chuàng)建、檢索(查找)、插入、刪除和修改等。 (1)創(chuàng)建鏈表是指,從無到有地建立起一個鏈表,即往空鏈表中依次插入若干結(jié)點(diǎn),并保持結(jié)點(diǎn)之間的前驅(qū)和后繼關(guān)系。 (2)檢索操作是指,按給定的結(jié)點(diǎn)索引號或檢索條件,查找某個結(jié)點(diǎn)。如果找到指定的結(jié)點(diǎn),則稱為檢索成功;否則,稱為檢索失敗。 (3)插入操作是指,在結(jié)點(diǎn)ki-1與ki之間插入一
41、個新的結(jié)點(diǎn)k,使線性表的長度增1,且ki-1與ki的邏輯關(guān)系發(fā)生如下變化: 插入前,ki-1是ki的前驅(qū),ki是ki-1的后繼;插入后,新插入的結(jié)點(diǎn)k成為ki-1的后繼、ki的前驅(qū)。,鏈表的操作,2020/8/8,106,2020/8/8,107,(4)刪除操作是指,刪除結(jié)點(diǎn)ki,使線性表的長度減1,且ki-1、ki和ki+1之間的邏輯關(guān)系發(fā)生如下變化: 刪除前,ki是ki+1的前驅(qū)、ki-1的后繼;刪除后,ki-1成為ki+1的前驅(qū),ki+1成為ki-1的后繼。,2020/8/8,108,例8-19:鏈表的基本操作。,包括: (1)建立一條無序鏈表; (2)輸出鏈表上各結(jié)點(diǎn)的數(shù)據(jù); (3)刪
42、除鏈表上一個結(jié)點(diǎn); (4)建立一條有序鏈表,輸出鏈表上的各結(jié)點(diǎn)的數(shù)據(jù)。,結(jié)點(diǎn)的結(jié)構(gòu)如下: struct node int data; node *next; ;,2020/8/8,109,建立一條無序鏈表,函數(shù)如下:,node *create( ) node *p1,*p2,*head; int a; head=0; /建立空鏈表 couta;,2020/8/8,110,while(a!=-1) p1=new node; /申請空間 p1-data=a; /給新空間賦值 if(head=0) /若為空表 head=p1;p2=p1; /將新結(jié)點(diǎn)插入 else /非空表 p2-next=p1;p
43、2=p1; /將新結(jié)點(diǎn)插入 cina; if(head)p2-next=0; /最后一個結(jié)點(diǎn)的指針域賦0 return(head); ,2020/8/8,111,輸出鏈表上各個結(jié)點(diǎn)的值,函數(shù)如下:,void Print(const node *head) const node *p; p=head; coutdatanext; /p指向下一個結(jié)點(diǎn) coutn; ,2020/8/8,112,刪除鏈表上具有指定值的一個結(jié)點(diǎn),函數(shù)如下:,node *Delete_one_node(node *head, int num) node *p1,*p2; if(head=NULL) /鏈表空,不做 cou
44、t鏈表為空,無結(jié)點(diǎn)可刪!n; return(NULL); ,2020/8/8,113,if(head-data=num) p1=head; /若要刪首結(jié)點(diǎn),則將p1指向第一個結(jié)點(diǎn) head=head-next; /head指向第二個結(jié)點(diǎn) delete p1; /刪除p1所指結(jié)點(diǎn) cout刪除了一個結(jié)點(diǎn)!n; ,2020/8/8,114,else p2=p1=head; while(p2-data!=num /p2指向后一個結(jié)點(diǎn) ,2020/8/8,115,if(p2-data=num) p1-next=p2-next; /與下一行一起刪除p2所指結(jié)點(diǎn) delete p2; cout刪除了一個結(jié)
45、點(diǎn)!n; else coutnum 鏈表上沒有找到要刪除的結(jié)點(diǎn)!n; /沒有要刪的結(jié)點(diǎn) return(head); ,2020/8/8,116,釋放鏈表的結(jié)點(diǎn)空間。函數(shù)如下:,void deletechain(node *h) node *p1; while(h) p1=h; /與下一行一起完成取下一個結(jié)點(diǎn)的工作 h=h-next; delete p1; /刪除p1所指結(jié)點(diǎn) ,2020/8/8,117,將一個結(jié)點(diǎn)插入有序鏈表仍保持有序。函數(shù)如下:,node *Insert(node *head,node *p) node *p1,*p2; if(head=0) head=p; /空表時使hea
46、d指向p p-next=0; /鏈表尾指針為0 return(head); ,2020/8/8,118,if(head-data=p-data) /p所指結(jié)點(diǎn)插入首部 p-next=head; /head所指向的鏈表接在p之后 head=p; /head指向新的鏈表首部 return(head); p2=p1=head; while(p2-next ,2020/8/8,119,if(p2-datadata) /插入到最后 p2-next=p; p-next=0; else /將p所指結(jié)點(diǎn)插入到p1與p2之間 p-next=p2; p1-next=p; return(head); ,2020/8
47、/8,120,建立一條有序鏈表。函數(shù)如下:,node *Create_sort(void) node *p1,*head=0; int a; couta; while(a!=-1) p1=new node; p1-data=a; head=Insert(head,p1); cina; return(head); ,2020/8/8,121,完成鏈表處理的完整程序如下:,#include struct node int data; node *next; ;,2020/8/8,122,node *Create(void) /產(chǎn)生一條無序鏈表 node *p1,*p2,*head; int a;
48、head=0; couta; while(a!=-1) p1=new node; p1-data=a; if(head=0) /插入鏈表的首部 head=p1;p2=p1; else /插入鏈表尾 p2-next=p1;p2=p1; cina; if(head)p2-next=0; return(head); ,2020/8/8,123,void Print(const node *head) /輸出鏈表上各結(jié)點(diǎn)的數(shù)據(jù) const node *p; p=head; coutdatanext; coutn; ,2020/8/8,124,node *Delete_one_node(node *head,int num) /刪除一個結(jié)點(diǎn) node *p1,*p2; if(head=0) coutdata=num) /刪除鏈表首結(jié)點(diǎn) p1=head; head=head-next; delete p1; cout刪除了一個結(jié)點(diǎn)!n; ,2020/8/8,125,else p1=head; p2=head-next; while(p2-da
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)美術(shù)教學(xué)中創(chuàng)造力培養(yǎng)的跨學(xué)科融合研究課題報告教學(xué)研究課題報告
- 金融業(yè)務(wù)流程自動化優(yōu)化-第14篇
- 邊緣計算支持的實(shí)時數(shù)據(jù)分析系統(tǒng)設(shè)計-洞察及研究
- 初中英語項目式學(xué)習(xí)中的教學(xué)設(shè)計優(yōu)化策略研究教學(xué)研究課題報告
- 基因調(diào)控網(wǎng)絡(luò)在NKG2D重編程中的應(yīng)用-洞察及研究
- 花蛇解癢膠囊療效評價-洞察及研究
- 碘甘油合成反應(yīng)動力學(xué)-洞察及研究
- 培訓(xùn)激勵機(jī)制創(chuàng)新
- 跨界合作模式創(chuàng)新-第5篇-洞察及研究
- 2026年財務(wù)管理員面試問題集及分析方法
- 網(wǎng)店運(yùn)營中職PPT完整全套教學(xué)課件
- 北師大版八年級數(shù)學(xué)下冊課件【全冊】
- 關(guān)于提高護(hù)士輸液時PDA的掃描率的品管圈PPT
- GB/T 30564-2023無損檢測無損檢測人員培訓(xùn)機(jī)構(gòu)
- 中華人民共和國汽車行業(yè)標(biāo)準(zhǔn)汽車油漆涂層QC-T484-1999
- XGDT-06型脈動真空滅菌柜4#性能確認(rèn)方案
- GB/T 96.2-2002大墊圈C級
- 第九章-第一節(jié)-美洲概述
- GB/T 13004-2016鋼質(zhì)無縫氣瓶定期檢驗與評定
- GB/T 12060.5-2011聲系統(tǒng)設(shè)備第5部分:揚(yáng)聲器主要性能測試方法
- GB/T 11945-2019蒸壓灰砂實(shí)心磚和實(shí)心砌塊
評論
0/150
提交評論