版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
主講人:曹宣俊C++面向?qū)ο蟪绦蛟O(shè)計2024/2/13目錄指針常用字符串處理函數(shù)函數(shù)課后習題2024/2/13指針指針是一種數(shù)據(jù)類型,具有指針類型的變量稱為指針變量。一個指針變量所存儲的信息是一個對象在內(nèi)存中的地址。通過指針可以間接地訪問對象。每一個指針變量都有一個相應(yīng)的基類型。基類型用以說明這個指針所指向的地址中存放數(shù)據(jù)的數(shù)據(jù)類型。2024/2/13指針基類型*指針變量int *pi指向int型的指針float*pl;指向float型的指針char*pc;指向char型的指針char(*pa)[3]指向一維數(shù)組的指針int
(*pf)();指向函數(shù)的指針int **pp;指向指針的指針2024/2/13指針一個指針所占的內(nèi)存空間大小與一個內(nèi)存地址所占空間相等32位機器中指針占有四個字節(jié)即int*pi和double*pd都一樣都占有四個字節(jié)2024/2/13指針的用法錯誤用法一int*p;*p=10;為什么出錯呢?這是因為指針也是一個變量,在執(zhí)行int*p語句時,只給p分配了空間,它是一個長度是4個字節(jié)的地址空間,并沒有分配它指向的空間,也就是說,p的值是一個沒有意義的地址值,顯然*p也是沒有意義的,當執(zhí)行 *p=10;語句時肯定出錯,改正的方法是先分配平指向的空間,再賦值
int*p=newint; *p=10
2024/2/13指針的用法錯誤用法二
上面的語句是否可以寫成這樣呢?
int*p=10;注意:p是一個指針變量,不能賦常量值。但是以下語句是正確的:char*p=“string”;這是因為計算機先給字符串“string”分配一個空間,并將其首地址賦值給p。但是要注意的是p指向的是單個字符,如以下語句cout<<“*p”<<*p<<endl;只輸出s,要想輸出整個字符串,應(yīng)該為:cout<<“p=”<<p<<endl;2024/2/13指針的用法前面列舉了兩種可能誤用指針的例子從前面的例子可以看出指針使用的繁瑣,但是為什么還要使用指針呢?原因:1指針和數(shù)組相比,如果利用下標訪問元素,指針比數(shù)組要處理起來快
2024/2/13一維指針數(shù)組的指針表示法Int a[5];//a是一維數(shù)組名,它有五個int型變量。當用指針表示時,*(a+i)與a[i](其中,i=1,2,3,4,5)是相同的。常量指針與變量指針是有區(qū)別的。例如:inta[10],*p;p=a;表達式p+1,a+2,p=p+1,p-a等都是合法的;而表達式a=a+1,a=a-1等是非法的。為什么?2024/2/13二維指針數(shù)組的指針表示法例如:intb[2][3];//b是二維數(shù)組名,它有個int型變量當用指針表示時,*(*(b+i)+j)與b[i][j](其中i=0,1;j=0,1,2)是相同的。一個二維數(shù)組可以看成是一個一維數(shù)組,即行數(shù)組,每個元素(即每個行數(shù)組)又是具有3個元素的一維數(shù)組,稱為列數(shù)組。因此,b[2][3]可以看成2個元素的一維行數(shù)組和3個元素的一維數(shù)組,稱為列數(shù)組。因此,b[2][3]可以看成為2個元素的一維行數(shù)組和3個元素的一維列數(shù)組組成。前面講過了一維數(shù)組的指針表示,將二維數(shù)組的行,列的一維數(shù)組都用指針表示,便得到如下形式:*(*(b+i)+j)2024/2/13二維指針數(shù)組的指針表示法
數(shù)據(jù)的一種重要表現(xiàn)形式,常量的值不可改變,這是個二級指針。再將二維數(shù)組的行數(shù)組用下標表示,列數(shù)組用指針表示,得到如下形式:*(b[i]+j)再將二維數(shù)組的行數(shù)組用指針表示,列數(shù)組用下標表示,又得到如下形式:(*(b+i))[j]另外按照二維數(shù)組在內(nèi)存中的排放順序,用指向數(shù)組首元素的一級指針表示如下:*(&b[0][0]+3*i+j)2024/2/13常用字符串處理函數(shù)char*strstr(constchar*srcstr,constchar*substr);應(yīng)用舉例:char*substr=“sip:”;char*srcstr=“http:sip:808@48:26780;lr.sip:8084567@”;char*startstr=strstr(srcstr,substr);char*endstr=strstr(srcstr.”@”);int
len=endstr-startstr-4;charservicekey[8]={0};memcpy(servicekey,startstr+4,len)cout<<servicekey<<endl;2024/2/13常用字符串處理函數(shù)char*strtok(char*,constchar*); chart_sep[]="|"; char*ptoken=NULL; charcountrycode[]="86|89|973";
ptoken=strtok(countrycode,t_sep);
bool
t_bExist=false;while(ptoken!=NULL){ if(strcmp(ptoken,"973")==0)//對比國家碼
{
t_bExist=true; break;}ptoken=strtok(NULL,t_sep);//}
if(t_bExist) {
cout<<"存在"<<endl; } else {
cout<<"不存在"<<endl; }2024/2/13變量作用域在C++中,所定義的變量分為局部變量和全部變量局部變量局部變量是指作用域在函數(shù)級和塊級的變量。包含有自動變量(auto)和內(nèi)部靜態(tài)變量(static)以及函數(shù)參數(shù)自動變量是定義在函數(shù)體內(nèi)或分程序內(nèi),定義時可以加說明符auto,也可以省略,所以,在程序中無特殊說明的變量都默認為自動變量。由于自動變量以堆棧方式占用內(nèi)存空間,因此在運行到此作用域時,系統(tǒng)會立刻為這個變量分配內(nèi)存空間,而程序運行后,這個堆棧立即被系統(tǒng)回收,即這個變量會消失。與自動變量作用域相同的另一種變量是寄存器,這種變量也是定義在函數(shù)體內(nèi)或者分程序內(nèi),定義時前面加register。寄存器類變量有可能被存放在CPU的通用內(nèi)存中,這樣可提高存取速度,如果沒被存放在通用內(nèi)存,便會按照自動變量處理。能否存放在通用寄存器中,取決于通用寄存器是否空閑。定義寄存器變量時,應(yīng)注意一下幾點:(1)該變量的數(shù)據(jù)長度與通用寄存器的長度相當,一般是char或者int(2)寄存器變量不宜太多,因為通用寄存器數(shù)量畢竟有限(3)要選擇使用頻率相當?shù)淖兞孔鳛榧拇嫫髯兞?,例如,多重循環(huán)的內(nèi)重循環(huán)變量等。2024/2/13變量作用域內(nèi)部變量是定義在函數(shù)體內(nèi)或者分程序內(nèi),并且用說明符static說明的一種變量。它的作用和自動變量相同。但是C++編譯器以固定地址存放這個變量,而不是以堆棧存放。因此只要整個程序在運行,這個變量就會存在。內(nèi)部靜態(tài)變量定義函數(shù)體內(nèi),它的作用域定義在它的函數(shù)體內(nèi)或分程序內(nèi),然而在定義它的作用域外,雖然不可見,但仍然存在,沒有被釋放掉,一旦回到它的作用域后,它仍然保留其原有的值。理解了這個特點后,便會分析和選用適當?shù)淖兞款愋土恕?024/2/13靜態(tài)變量示例程序voidfunc(intv){ staticintvalue=v;
cout<<"value:"<<value<<endl;}func(2);func(4);2024/2/13全局變量全局變量是指作用域在程序級或文件級的變量。包括外部變量和外部靜態(tài)變量。 外部變量的作用域是程序級的,即在一個文件定義的外部變量,在該程序的其它文件中是可以用的,外部變量定義在函數(shù)體外,定義任何存儲類型說明,外部變量在引用其需要說明,說明外部變量時應(yīng)在其前面加說明符extern,表示該變量時外部變量。在一個文件中,先引用后定義的外部變量引用前必須說明,這稱為外部變量提前說明,在一個文件中定義的外部變量在另一個文件中要引用,則在其前必須說明??梢?,外部變量的定義和說明是兩回事,在一個程序中,一個外部變量只能定義一次,但是可以說明多次。內(nèi)部靜態(tài)變量定義時時有默認值的,int為0,浮點型為0.0,char為空。外部變量和外部靜態(tài)變量也是如此,但是自動變量和寄存器變量定義后沒賦值,是不會有默認值的。2024/2/13函數(shù)函數(shù)的定義和說明在C++中,定義函數(shù)的格式如下數(shù)據(jù)類型函數(shù)名(參數(shù)表){
語句序列;}2024/2/13函數(shù)的定義和說明示例程序計算1+2…+100int sum(intn){
int
i,s=0;
for(i=1;i<=n;++i) s+=i; returns;}2024/2/13函數(shù)的定義和說明定義函數(shù)時,參數(shù)表中的參數(shù)稱為形式參數(shù),簡稱形參。形參在該函數(shù)被調(diào)用時才被初始化。形參的使用將使被調(diào)用函數(shù)可以從調(diào)用函數(shù)那里獲得數(shù)據(jù)。如果被調(diào)用函數(shù)不需要從調(diào)用函數(shù)那里獲得數(shù)據(jù),則該函數(shù)參數(shù)表可以為空。函數(shù)的說明 (1)如果一個函數(shù)定義在前,調(diào)用在后,則調(diào)用前不需要說明(2)如果定義在后,調(diào)用在后,調(diào)用前必須說明說明函數(shù)的格式數(shù)據(jù)類型函數(shù)名(參數(shù)表);舉例:intsum(int);2024/2/13函數(shù)的調(diào)用函數(shù)的調(diào)用格式函數(shù)名(實參表);其中,實參表給出調(diào)用函數(shù)相對應(yīng)的實參,當有一個以上的參數(shù)時需用逗號分隔,每個參數(shù)是一個變量或表達式。函數(shù)調(diào)用過程是將實參傳給形參,執(zhí)行函數(shù)體后將結(jié)果返回。C++中,實參傳給形參的方式有如下幾種:(1)傳值調(diào)用(2)傳址調(diào)用(3)引用調(diào)用2024/2/13傳值調(diào)用傳值調(diào)用時,調(diào)用函數(shù)的實參,使用常量,變量或者表達式值,被調(diào)用函數(shù)的形參使用變量值。調(diào)用時,系統(tǒng)先計算實參表達式的值,再將實參的值按位置對應(yīng)的賦值給形參,即對形參進行初始化。因此,傳值調(diào)用的實現(xiàn)機制是系統(tǒng)將實參備份一個副本給形參。在被調(diào)用函數(shù)中,形參可以改變,但這只影響副本中的形參值,而不影響調(diào)用函數(shù)的實參值。所以,傳值的調(diào)用的特點是形參值的改變不影響實參。 2024/2/13傳值調(diào)用示例程序一
voidswap(int
x,inty){
int
tmp;
tmp=x;x=y;y=tmp;}2024/2/13傳值調(diào)用示例程序二舉例
voidfun(int*p){ p=newint[20];}2024/2/13傳址調(diào)用使用傳址調(diào)用方式時,調(diào)用函數(shù)的實參使用地址值,被調(diào)用函數(shù)的形參使用指針,。調(diào)用時系統(tǒng)將實參的地址賦值給對應(yīng)的形參指針,使形參指針指向?qū)崊⒆兞?。因此,傳址調(diào)用與前面講過的傳值調(diào)用不同,它的實現(xiàn)機制是讓形參的指針直接指向?qū)崊ⅰK?,傳址調(diào)用時,在被調(diào)用函數(shù)中,可以通過改變形參指針所指向的實參變量來間接改變實參值。2024/2/13傳址調(diào)用示例程序一voidswap(int*x,int*y){
int
tmp;
tmp=*x;*x=*y;*y=tmp;}2024/2/13傳址調(diào)用示例程序二voidfun(int**p){ *p=newint[20];}2024/2/13引用調(diào)用使用引用調(diào)用時,調(diào)用函數(shù)的實參要用變量,將實參賦值給形參的引用,相當于使用了實參的別名。于是在被調(diào)用函數(shù)中,對引用的改變,實質(zhì)就是直接的通過引用來改變實參的變量值。而且這種調(diào)用起到傳址調(diào)用的作用,但它又比傳址調(diào)用更方便更直接。2024/2/13引用調(diào)用示例程序一voidswap(int&x,int&y){
int
tmp;
tmp=x;x=y;y=tmp;}2024/2/13函數(shù)的參數(shù)函數(shù)參數(shù)的求值順序當一個函數(shù)帶有多個參數(shù)時,C++語言沒有規(guī)定在函數(shù)調(diào)用時參數(shù)的求值順序。而編譯器根據(jù)對代碼進行優(yōu)化的需要自行規(guī)定對實參的求值順序。有的編譯器規(guī)定自左向右,有的自右向左。一般,求值順序不會對函數(shù)功
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度電商虛擬現(xiàn)實技術(shù)應(yīng)用委托經(jīng)營協(xié)議3篇
- 二零二五年度奶粉品牌線上直播帶貨代理合同
- 二零二五版智能停車場建設(shè)工程承包簡易合同3篇
- 二零二五年度公益活動布展策劃與實施協(xié)議3篇
- 2025年度煤炭行業(yè)信用風險管理合作協(xié)議書
- 2025年綠色建筑項目泥水工安全責任合同
- 二零二五年度馬鈴薯種植保險及風險防控合作協(xié)議4篇
- 二零二五年船舶空調(diào)系統(tǒng)改造與環(huán)保驗收合同3篇
- 個人住宅室內(nèi)裝修設(shè)計服務(wù)合同(2024版)3篇
- 2025年度化肥電商平臺合作與服務(wù)協(xié)議2篇
- 物流無人機垂直起降場選址與建設(shè)規(guī)范
- 肺炎臨床路徑
- 外科手術(shù)鋪巾順序
- 創(chuàng)新者的窘境讀書課件
- 綜合素質(zhì)提升培訓全面提升個人綜合素質(zhì)
- 如何克服高中生的社交恐懼癥
- 聚焦任務(wù)的學習設(shè)計作業(yè)改革新視角
- 移動商務(wù)內(nèi)容運營(吳洪貴)任務(wù)三 APP的品牌建立與價值提供
- 電子競技范文10篇
- 食堂服務(wù)質(zhì)量控制方案與保障措施
- VI設(shè)計輔助圖形設(shè)計(2022版)
評論
0/150
提交評論