C++大學(xué)教程指針和基本指針的字符串課件_第1頁(yè)
C++大學(xué)教程指針和基本指針的字符串課件_第2頁(yè)
C++大學(xué)教程指針和基本指針的字符串課件_第3頁(yè)
C++大學(xué)教程指針和基本指針的字符串課件_第4頁(yè)
C++大學(xué)教程指針和基本指針的字符串課件_第5頁(yè)
已閱讀5頁(yè),還剩65頁(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)介

第八章指針和基于指針的字符串指針引用調(diào)用數(shù)組與指針函數(shù)指針基于指針的字符串總結(jié)1指針:地址數(shù)據(jù)我們首先的觀念就是簡(jiǎn)單地把地址作為數(shù)據(jù),可以把地址存儲(chǔ)在內(nèi)存中。

intx;10002

x=2;1004 1020

1000由于地址作為數(shù)據(jù)對(duì)待,他們也可以存儲(chǔ)在內(nèi)存中。2一個(gè)變量的指針當(dāng)一個(gè)變量存儲(chǔ)另一個(gè)變量的地址時(shí),那我們說(shuō)它就是那個(gè)變量的指針。在內(nèi)存表中,我們經(jīng)常用箭頭來(lái)表示指針,x的真實(shí)地址和我們 理解的概念不 相關(guān)。我們經(jīng)常用任意地址描述指針,同時(shí)在以后經(jīng)常 會(huì)放棄它。intx;10002x=2;1004 1020 1000我們把1000作為整數(shù)2的指針3指針變量的聲明如何定義一個(gè)變量為指針變量?

類(lèi)型標(biāo)識(shí)符*指針變量;如:int*intp;double*doublep; char*chPtr;多個(gè)指針變量需要分別加*:double*doublep,*doubleq;5關(guān)于指針的幾個(gè)問(wèn)題回答這些問(wèn)題可以使我們更好地理解指針。

intx,*px;

x=2; 1000x21004問(wèn)題:1、如何把x的地址置入px中?2、如何用px處理和改變x?

1020px6問(wèn)題1:指針賦值我們不能用簡(jiǎn)單的常數(shù)作為地址對(duì)指針進(jìn)行賦值。我們永遠(yuǎn)不知道當(dāng)我們編寫(xiě)程序時(shí),變量地址的值將是什么?

intx,*px;

1000

x=2;21004問(wèn)題:1、如何把x的地址置入px中? 我們不能用這樣表示:1020

px

px=1000;

7地址運(yùn)算符提供運(yùn)算符返回操作數(shù)的地址,我們用&來(lái)表示。

intx,*px;1000

x=2;21004我們想要做的:

px=x的地址

1020我們應(yīng)該表示為: px

px=&x9處理內(nèi)存地址使用變量的指針就是為了用這個(gè)指針得到變量的值并改變它。 intx,*px;10002 x=2;1004 px=&x;2、我們?cè)鯓佑胮x得到x的值并改變它? 1020 px

10問(wèn)題2:處理內(nèi)存地址如何用指針變量處理和改變它所指向的單元的值?用引用運(yùn)算符“*”解決。如*intp表示的是intp指向的這個(gè)單元的內(nèi)容。在對(duì)intp使用引用運(yùn)算之前,必須先對(duì)intp賦值11指針處理我們可以認(rèn)為一個(gè)指針是另一個(gè)變量的參考,當(dāng)我們處理這個(gè)變量時(shí),我們叫這個(gè)運(yùn)算符為“參考運(yùn)算符”,這個(gè)操作為“參考指針”

intx,*px,y; 1000 x2 x=2; 10042 px=&x; y y=*px;

1020px*為引用運(yùn)算符

13指針的基本類(lèi)型為什么指針要指向一定類(lèi)型的數(shù)據(jù)?地址對(duì)于編譯器來(lái)說(shuō)不足以解析地址的數(shù)據(jù)類(lèi)型。由于指針的基本數(shù)據(jù)類(lèi)型可以對(duì)指針表達(dá)式進(jìn)行錯(cuò)誤檢查,比如,分配一 個(gè)整型數(shù)據(jù)指 針,或者反之 將產(chǎn)生一個(gè)警 告。

intx,*px,y; 1000 x2 x=2; 1004 px=&x; y2 y=*px;

1020指針必須要有一個(gè)明確的數(shù)據(jù)類(lèi)型px1000以便編譯器可以解析數(shù)據(jù)的指向類(lèi)型 14指針實(shí)例如有:intX,*intp,Y;X=3;Y=4;intp=&X;1000intp10044Y10003X如執(zhí)行:*intp=Y+4;1000intp10044Y10008X注意:不能用intp=100;因?yàn)槲覀冇肋h(yuǎn)不知道變量存儲(chǔ)的真實(shí)地址,而且程序每次運(yùn)行可能都不同。運(yùn)行Fig.8.4觀察aPtr值的變化15指針變量的使用練習(xí)設(shè)有定義intx,y;int*p1,*p2;1000x1004y1008p11012p2執(zhí)行語(yǔ)句:x=23;y=234;100023x1004234y1008p11012p2執(zhí)行語(yǔ)句:p1=&x;p2=&y;100023x1004234y10081000p110121004p2執(zhí)行語(yǔ)句:*p1=34;*p2=17;100034x100417y10081000p110121004p217指針實(shí)例有以下結(jié)構(gòu)

Ap1aBp2b比較執(zhí)行p1=p2和*p1=*p2后的不同結(jié)果。

解:

Ap1aBp2bBp1aBp2b18指針的初始化指針在使用前必須初始化。僅和別的變量一樣定義指針,不初始化是一個(gè)比較普遍的錯(cuò)誤。沒(méi)有初始化的指針可能指向任意地址,對(duì)這些指針作操作可能會(huì)導(dǎo)致程序錯(cuò)誤。NULL是一個(gè)特殊指針值,稱(chēng)為空指針。它的值為0。它可被用來(lái)初始化一個(gè)指針,表示不指向任何地址。19第八章指針和基于指針的字符串指針引用調(diào)用數(shù)組與指針函數(shù)指針基于指針的字符串總結(jié)21傳參數(shù)到函數(shù)的方法C++有三種傳遞參數(shù)到函數(shù)的方法:按值傳遞,用引用參數(shù)按引用傳遞用指針參數(shù)按引用傳遞按值傳遞:在函數(shù)內(nèi)部對(duì)形式參數(shù)的任何改變都不會(huì)影響實(shí)際參數(shù)的值。voidsa,intb){intc;c=a;a=b;b=c;}

如果調(diào)用swap(x,y);并不能真正交換x和y的值!!!22引用調(diào)用但在某些應(yīng)用中確實(shí)需要改變實(shí)際參數(shù)的值。例如,我們經(jīng)常需要修改兩個(gè)變量的值,希望有個(gè)函數(shù)可以實(shí)現(xiàn)此功能。要解決此問(wèn)題可以采用指針作為參數(shù)。23指針作為函數(shù)參數(shù)voids*a,int*b){intc,d;c=*a;*a=*b;*b=c;a=&c;b=&d}

s,&y)34xyabcd這里,通過(guò)傳指針仍然交換了x,y的值,交換后a,b又分別獲得了局部變量c,d的地址.所以函數(shù)本質(zhì)上還是傳值,是將地址值傳給了a,b變量.調(diào)用:25引用傳遞步驟把函數(shù)參數(shù)聲明為指針在函數(shù)體內(nèi)使用間接訪問(wèn)指針當(dāng)調(diào)用函數(shù)時(shí),把地址作為參數(shù)傳遞26SolveQuadratic的調(diào)用intmain(void){doublea,b,c,x1,x2;intresult;cout<<“inputa,b,c:\n”;cin<<a<<b<<c;result=SolveQuadratic(a,b,c,&x1,&x2);if(result)cout<<“error”;elsecout<<“x1=“<<x1<<x2=“<<x2;}29const修飾指針指針是如此的奇妙,通過(guò)傳遞指針值,函數(shù)獲得了對(duì)外界變量空間的訪問(wèn)權(quán)限,尤其為其創(chuàng)造了修改空間中數(shù)據(jù)的機(jī)會(huì).如何通過(guò)指針只能做讀取,而不能寫(xiě)入?用const修飾加const的時(shí)機(jī):遵循最小特權(quán)原則,對(duì)于函數(shù)的參數(shù),在能滿足函數(shù)處理數(shù)據(jù)的要求的前提下,給予它最小的權(quán)限30const修飾參數(shù)的四種方式(1)指向非常量的非常量指針調(diào)用:intx;f(&x)voidf(int*ptr){ 可以通過(guò)引用改變x的值;//*ptr=3;可以改變ptr本身的值;//ptr++;};

此時(shí),x是變量,ptr也是變量31指向常量數(shù)據(jù)的非常量指針調(diào)用:intx;f(&x)voidf(constint*ptr){ 不可以通過(guò)引用改變x的值;//*ptr=3;可以改變ptr本身的值;//ptr++;};

此時(shí),x是變量,ptr也是變量,但不可以通過(guò)對(duì)ptr的引用運(yùn)算而修改x的值const修飾參數(shù)的四種方式(2)32指向非常量的常量指針調(diào)用:intx;f(&x)voidf(int*constptr){ 可以通過(guò)引用改變x的值;//*ptr=3;不可以改變ptr本身的值;//ptr++;};

此時(shí),ptr是常量,x的值也不可以通過(guò)ptr的引用方式來(lái)改動(dòng)const修飾參數(shù)的四種方式(3)33指向常量的常量指針調(diào)用:intx;f(&x)voidf(constint*constptr){ 不可以通過(guò)引用改變x的值;//*ptr=3;不可以改變ptr本身的值;//ptr++;};

此時(shí),ptr是變量,ptr所指的空間中的值也不能通過(guò)它來(lái)改變const修飾參數(shù)的四種方式(4)34sizeofsizeof(類(lèi)型名)返回該數(shù)據(jù)類(lèi)型單個(gè)元素所占的字節(jié)數(shù)sizeof數(shù)組名返回該數(shù)組所占的字節(jié)數(shù)intarray[10];cout<<sizeofarray<<endl;voidf(int*p,intlen){cout<<sizeofp<<endl;}調(diào)用f(array,10);返回10*4即40輸出4,即一個(gè)指針變量占據(jù)的空間,而非數(shù)組array占據(jù)的空間35指針小結(jié)intx,y,*p; 定義一個(gè)整型指針。如定義多個(gè)指針變量,則在每個(gè)變量前都要加*p=&x;把變量的地址賦給指針*p=2;改變指針指向的地址的值y=*p;指針指向的地址中的值賦給一個(gè)變量S);傳遞地址參數(shù)voidS*p1,int*p2)定義指針作為形式參數(shù)36第八章指針和基于指針的字符串指針引用調(diào)用數(shù)組與指針函數(shù)指針基于指針的字符串總結(jié)37數(shù)組與指針在C++中,數(shù)組與指針是密切相關(guān)的,兩者幾乎可以交換使用.數(shù)組名代表數(shù)組的起始地址,因此一個(gè)數(shù)組名就是一個(gè)常量指針.數(shù)組與指針相同之處在訪問(wèn)內(nèi)存方面的操作方式幾乎相同數(shù)組與指針不同之處1、系統(tǒng)內(nèi)存空間分配不同2、數(shù)組名是常量指針,不能修改它的值。38指針的運(yùn)算constintN=5;inta[N]={1,2,3,4,5};假設(shè)300是a的基地址int*p;12345ap+i本質(zhì)是p+4*i3、*(a+2)?2、++p;1、p=a;p=300p=300+4*1339數(shù)組與指針——相同之處constintN=5;inta[N],*p;假設(shè)300是a的基地址如下操作是允許的:p=&a[0];

此時(shí)p=300等價(jià)于p=&a[1];此時(shí)p=304;p=a;p=a+1;

40數(shù)組與指針——相同之處constintN=5;inta[N],*p;假設(shè)300是a的基地址對(duì)數(shù)組求和的三種方式:方法1:sum=0;for(p=a;p<&a[N];++p)sum+=p;方法2:sum=0;for(i=0;i<N;++i)sum+=*(a+i);方法3:p=a;sum=0;for(i=0;i<N;++i)sum+=

p[i];41數(shù)組與指針——不同之處系統(tǒng)內(nèi)存空間分配不同constintN=5;inta[N],*p;假設(shè)300是a的基地址300304308312316a[0]a[1]a[2]a[3]a[4]ap42constintN=5;inta[N],*p;假設(shè)300是a的基地址以下操作是不允許的:a=p;a++;a+=3;a是常量指針,不能修改它的值。運(yùn)行并分析Fig.8.20,Fig.8.21數(shù)組與指針——不同之處43指針數(shù)組數(shù)組是同種數(shù)據(jù)類(lèi)型數(shù)據(jù)的集合,該類(lèi)型當(dāng)然也可以是指針.指針數(shù)組:數(shù)組的每個(gè)元素都是指針如:char*a[4];charch1,ch2,ch3,ch4

a[0]=&ch1;a[1]=&ch2;a[2]=&che3;a[3]=&ch4;44指針數(shù)組實(shí)際應(yīng)用中,常見(jiàn)的做法是字符串?dāng)?shù)組:constchar*suit[4]={“Hearts”,“Diamonds”,“Clubs”,“Spades”}

字符串?dāng)?shù)組中的每一項(xiàng)都是一個(gè)字符串,實(shí)際指向相應(yīng)字符串的第一個(gè)字符的指針(地址)

45第八章指針和基于指針的字符串指針引用調(diào)用數(shù)組與指針函數(shù)指針基于指針的字符串總結(jié)46函數(shù)指針指向函數(shù)的指針:

指針指向內(nèi)存中函數(shù)代碼存放的起始地址函數(shù)指針和其它指針一樣也可以傳遞給函數(shù)、從函數(shù)中返回、賦給其他的函數(shù)指針、存儲(chǔ)在數(shù)組中。函數(shù)指針的聲明:如bool(*compare)(int,int)類(lèi)型名(*指針變量名)(形式參數(shù)列表)47函數(shù)指針通過(guò)函數(shù)指針調(diào)用函數(shù):如(*compare)(3+5,x)其中x是int類(lèi)型(*指針變量名)(實(shí)際參數(shù)列表)函數(shù)指針常用在菜單驅(qū)動(dòng)的系統(tǒng)中,將不同的菜單功能設(shè)計(jì)成不同的函數(shù)來(lái)實(shí)現(xiàn),之后根據(jù)用戶輸入的不同通過(guò)函數(shù)指針調(diào)用不同的函數(shù).48例:Fig08.29//Fig.8.29:fig08_29.cpp//Demonstratinganarrayofpointerstofunctions.#include<iostream>usingstd::cout;usingstd::cin;usingstd::endl;//functionprototypes--eachfunctionperformssimilaractionsvoidfunction0(int);voidfunction1(int);voidfunction2(int);49例:Fig08.29intmain(){void(*f[3])(int)={function0,function1,function2};intchoice;cout<<"Enteranumberbetween0and2,3toend:";cin>>choice;聲明函數(shù)指針數(shù)組50例:Fig08.29

while((choice>=0)&&(choice<3))

{(*f[choice])(choice);cout<<"Enteranumberbetween0and2,3toend:";cin>>choice;}cout<<"Programexecutioncompleted."<<endl;return0;}通過(guò)函數(shù)指針調(diào)用不同函數(shù)51例:Fig08.29voidfunction0(inta){cout<<"Youentered"<<a<<"sofunction0wascalled\n\n";}voidfunction1(intb){cout<<"Youentered"<<b<<"sofunction1wascalled\n\n";}voidfunction2(intc){cout<<"Youentered"<<c<<"sofunction2wascalled\n\n";}52第八章指針和基于指針的字符串指針引用調(diào)用數(shù)組與指針函數(shù)指針基于指針的字符串總結(jié)53串的定義字符串:是可以被當(dāng)作一個(gè)單元來(lái)處理的一系列字符從存儲(chǔ)方式上看:第一種解釋?zhuān)禾厥獾囊痪S字符數(shù)組charstr[size];

第二種解釋?zhuān)褐赶蜃址闹羔榗har*cptr;即:通過(guò)指向字符串第一個(gè)字符的指針來(lái)訪問(wèn)該字符串.一個(gè)字符串的值就是它的第一個(gè)字符的地址54串的結(jié)束符‘\0’

inta[3]={1,2,3}chars[3]={‘a(chǎn)’,’b’,’\0’}s的實(shí)際長(zhǎng)度為2,但必須分配2+1個(gè)空間,多余一個(gè)空間用來(lái)存放’\0’

串是以’\0’為結(jié)束符的一維字符數(shù)組55復(fù)習(xí)字符串(第7章內(nèi)容)空字符串:沒(méi)有任何字符,只有’\0’‘a(chǎn)’與”a”的區(qū)別

串的初始化方法:1:chars[4]={‘a(chǎn)’,’b’,’c’,’\0’};2:chars[]={‘a(chǎn)’,’b’,’c’,’\0’};3:chars[]=“abc”;4:constchar*p=“abc”;首先在內(nèi)存中為“abc”分配空間并將值寫(xiě)入,最后將該空間的起始地址賦給指針變量P56字符串的讀入兩種方式:用cin對(duì)象通過(guò)流提取讀入一個(gè)字符串到一個(gè)字符數(shù)組中。讀入時(shí)見(jiàn)到空白字符或文件結(jié)束符結(jié)束charword[10];cin>>word;通過(guò)cin調(diào)用函數(shù)getline讀入一個(gè)字符串到一個(gè)字符數(shù)組中。讀入時(shí)見(jiàn)到一個(gè)換行符號(hào)結(jié)束,結(jié)果串中不含換行符。charline[80];cin.getline(line,80);57字符串處理庫(kù)中的字符串操作函數(shù)#include<cstring>提供了字符串操作、比較、查找、計(jì)算長(zhǎng)度等函數(shù)char*strcpy(char*s1,constchar*s2)把s2復(fù)制到s1,直到遇到s2中的’\0’。s1要保證足夠空間。函數(shù)返回s1的值char*strncpy(char*s1,constchar*s2,size_tn)把s2復(fù)制到s1,且最多復(fù)制n個(gè)字符。s1要保證足夠空間。函數(shù)返回的是s1的值char*strcat(char*s1,contstchar*s2)把s1與s2拼接起來(lái),結(jié)果存放到s1中。程序員必須保證s1有足夠的空間容納拼接結(jié)果。函數(shù)返回的是串s1。58intstrcmp(constchar*s1,constchar*s2)按照字典次序比較s1和s2,s1<s2結(jié)果<0;s1=s2=0;s1>s2>0char*strcpy(char*s1,constchar*s2)把s2復(fù)制到s1,直到遇到s2中的’\0’。s1要保證足夠空間。函數(shù)返回的是s1size_tstrlen(constchar*s)函數(shù)返回’\0’前的字符個(gè)數(shù)字符串處理庫(kù)中的字符串操作函數(shù)59Fig08-32#include<iostream>usingstd::cout;usingstd::endl;#include<cstring>//prototypesforstrcatandstrncatusingstd::strcat;usingstd::strncat;intmain(){60chars1[20]="Happy";//length6chars2[]="NewYear";//length9chars3[40]="";cout<<"s1="<<s1<<"\ns2="<<s2;

strcat(s1,s2);//concatenates2tos1(length15)cout<<"\n\nAfterstrcat(s1,s2):\ns1="<<s1<<"\ns2="<<s2;//concatenatefirst6charactersofs1tos3

strncat(s3,s1,6);//places'\0'afterlastcharacter61

cout<<"\n\nAfterstrncat(s3,s1,6):\ns1="<<s1<<"\ns3="<<s3;

strcat(s3,s1);//concatenates1tos3cout<<"\n\nAfterstrcat(s3,s1):\ns1="<<s1<<"\ns3="<<s3<<endl;return0;}62Fig08-34

strtok把字符分解為一個(gè)個(gè)記號(hào)#include<iostream>usingstd::cout;usingstd::endl;#include<cstring>//prototypeforstrtokusingstd::strtok;intmain(){63charsentence[]="Thisisasentencewith7tokens";char*tokenPtr;cout<<"Thestringtobetokenizedis:\n"<<sentence<<"\n\nThetokensare:\n\n";//begintokenizationofsentence

tokenP

溫馨提示

  • 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)論