第5章指針與引用課件_第1頁
第5章指針與引用課件_第2頁
第5章指針與引用課件_第3頁
第5章指針與引用課件_第4頁
第5章指針與引用課件_第5頁
已閱讀5頁,還剩155頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第5章指針與引用.第5章指針與引用.1第5章指針與引用指針動態(tài)內(nèi)存分配指針與數(shù)組指針與函數(shù)字符串處理函數(shù)引用引用與函數(shù)指針與引用.第5章指針與引用指針.25.1指針指針是C++語言從C語言中繼承來的重要概念,是C++語言最重要的特色之一。指針的正確使用是C++語言的學(xué)習(xí)重點之一.5.1指針指針是C++語言從C語言中繼承來的重要概35.1.1數(shù)據(jù)存儲計算機內(nèi)存劃分為內(nèi)存單元,這些內(nèi)存單元按其順序進(jìn)行編址。程序運行時,系統(tǒng)將利用內(nèi)存存儲相關(guān)的數(shù)據(jù)數(shù)據(jù)在內(nèi)存中的存儲方式是:按其所屬的數(shù)據(jù)類型,占據(jù)一定數(shù)量的連續(xù)內(nèi)存單元程序中的每個變量在其生存期內(nèi)存儲的位置是不變的,具有固定的存儲地址.5.1.1數(shù)據(jù)存儲計算機內(nèi)存劃分為內(nèi)存單元,這些內(nèi)存單元45.1.1數(shù)據(jù)存儲C++程序運行時,系統(tǒng)會自動地根據(jù)變量數(shù)據(jù)類型為該變量分配相應(yīng)的內(nèi)存。必要時可以使用取地址運算符“&”來獲取變量的地址#include<iostream.h>intmain(){inti=1;cout<<″i=\t″<<i<<″\tTheaddressofit:\t″<<&i<<endl;return0;}.5.1.1數(shù)據(jù)存儲C++程序運行時,系統(tǒng)會自動地55.1.2指針的聲明及使用指針是用于存放內(nèi)存地址的變量??梢詫⒆兞康牡刂繁4嬖谥羔樦兄羔樖且粋€變量,必須先聲明,后使用

數(shù)據(jù)類型*標(biāo)識符;列出的數(shù)據(jù)類型并不是指針變量本身的類型,而是指針用于保存的地址值中存儲的變量的數(shù)據(jù)類型,即指針?biāo)赶蜃兞康臄?shù)據(jù)類型.5.1.2指針的聲明及使用指針是用于存放內(nèi)存地址的變量。65.1.2指針的聲明及使用任一指針變量本身數(shù)據(jù)值的類型都是unsignedlongint指針也可以和其他變量同時聲明使用指針前,必須首先給它賦一個合法的值。否則,程序中對指針的訪問有可能導(dǎo)致系統(tǒng)崩潰值為0的指針叫空指針.5.1.2指針的聲明及使用任一指針變量本身數(shù)據(jù)值的類型都75.1.2指針的聲明及使用如果在聲明時,指針初始化為0或根本沒有初始化,使用前,就必須首先給它賦有意義的值inti,*p1;p1=&i;.5.1.2指針的聲明及使用如果在聲明時,指針初始化為0或85.1.2指針的聲明及使用數(shù)組名表示的是該數(shù)組的首地址值intx[5],*px=x;intx[5],px=&x[0];inti,*p1=i;double*p2=&i;確實需要用不同類型變量的地址給指針賦值,就應(yīng)該采用強制類型轉(zhuǎn)換double*p2=(double*)&i.5.1.2指針的聲明及使用數(shù)組名表示的是該數(shù)組的首地址值95.1.2指針的聲明及使用每個變量在內(nèi)存中都有一個固定的地址,而指針中保存的就是變量的地址值。如果聲明一個指針,并使其值為某個變量的地址,就可以通過這個指針間接地訪問該變量利用指針來訪問變量需要使用間接訪問運算符“*”inti=1,*p=&i; cout<<*p;*p=2;cout<<*p;通過“*”運算訪問目的數(shù)據(jù)的過程也稱為“間接尋址”過程.5.1.2指針的聲明及使用每個變量在內(nèi)存中都有一個固定的105.1.2指針的聲明及使用P105例5-2.5.1.2指針的聲明及使用P105例5-2.115.1.2指針的聲明及使用指針是一個變量,在內(nèi)存中也需占據(jù)一定的空間,具有一個地址,這個地址也可以利用指針來保存聲明一個指針來指向它,這個指針稱為指向指針的指針,也即二級指針

數(shù)據(jù)類型**標(biāo)識符inti,*p=&iint**pp=&p;.5.1.2指針的聲明及使用指針是一個變量,在內(nèi)存中也需占125.1.2指針的聲明及使用P106例5-3#include<iostream.h>intmain(){inti;int*p=&i,**pp=&p;i=1;cout<<″i=\t″<<i<<endl;cout<<″*p=\t″<<*p<<endl;cout<<″p=\t″<<p<<endl;cout<<″*pp=\t″<<*pp<<endl;cout<<″**pp=\t″<<**pp<<endl;return0;}.5.1.2指針的聲明及使用P106例5-3.135.1.3指針運算指針是一個變量,它的值是一個地址。它只能參與賦值、算術(shù)及關(guān)系運算算術(shù)運算指針可以和整數(shù)進(jìn)行加減運算,包括增1和減1運算指針的算術(shù)運算與一般的數(shù)值計算不同,它不是簡單地將指針的值加上或減去給定的整數(shù)值,而是與指針?biāo)赶蜃兞康念愋陀嘘P(guān)指針加n的實際操作是使指針中的地址值加上sizeof(數(shù)據(jù)類型)*n指針減n的實際操作是使指針中的地址值減去sizeof(數(shù)據(jù)類型)*n.5.1.3指針運算指針是一個變量,它的值是一個地址。它只145.1.3指針運算指針加減運算一般用在對數(shù)組元素進(jìn)行操作的場合數(shù)組是連續(xù)存儲的,通過對指向數(shù)組的指針進(jìn)行加減運算,使指針指向數(shù)組中不同的元素。對指向普通變量的指針進(jìn)行加減運算后,指針?biāo)赶虻牡刂返挠猛臼遣淮_定如果兩個指針?biāo)赶虻淖兞款愋拖嗤?,也可以對它們進(jìn)行如下減法運算運算結(jié)果是一個整數(shù)值,它的絕對值就是兩個指針?biāo)赶虻牡刂分g相隔數(shù)據(jù)的個數(shù).5.1.3指針運算指針加減運算一般用在對數(shù)組元素進(jìn)行操作155.1.3指針運算關(guān)系運算指針的關(guān)系運算一般是在指向相同類型變量的指針之間進(jìn)行其他關(guān)系運算比較的也是兩個指針?biāo)赶虻牡刂分档拇笮 R话阌迷趯?shù)組進(jìn)行操作的場合.5.1.3指針運算關(guān)系運算.165.1.4與對象有關(guān)的指針指針可以指向任一類型的變量,也可以指向?qū)ο舐暶饕粋€指針來保存對象的地址,這個指針就是指向?qū)ο蟮闹羔?,簡稱對象的指針.5.1.4與對象有關(guān)的指針指針可以指向任一類型的變量,也171.對象的指針對象的指針的聲明方法與普通變量的指針相同類名*對象的指針名通過對象的指針間接訪問對象成員的方式相應(yīng)地表示為:(*對象的指針名).數(shù)據(jù)成員名(*對象的指針名).成員函數(shù)名(參數(shù)表).1.對象的指針對象的指針的聲明方法與普通變量的指針相同.181.對象的指針C++語言提供了另一個更常用的方法對象的指針名->數(shù)據(jù)成員名對象的指針名->成員函數(shù)名(參數(shù)表)“->”也叫做成員選擇運算符,該運算符用于通過對象的指針訪問對象成員.1.對象的指針C++語言提供了另一個更常用的方法.191.對象的指針P108例5-4.1.對象的指針P108例5-4.202.this指針this指針也是一個指向?qū)ο蟮闹羔?,它隱含在類成員函數(shù)中,用來指向成員函數(shù)所屬類的正在被操作的對象調(diào)用一個對象的成員函數(shù)時,系統(tǒng)會首先將這個對象的地址賦給被調(diào)用成員函數(shù)中的this指針。成員函數(shù)訪問數(shù)據(jù)成員時,就隱含地使用this指針來確保訪問到的數(shù)據(jù)成員屬于這個對象靜態(tài)成員函數(shù)沒有this指針.2.this指針this指針也是一個指向?qū)ο蟮闹羔?,它隱212.this指針P110例5-5.2.this指針P110例5-5.223.指向類成員的指針類實例化后,類中的數(shù)據(jù)成員和成員函數(shù)在內(nèi)存中也有一定的存儲地址,可以聲明指向類成員的指針。通過這些指針,可以訪問對象的成員指向成員函數(shù)的指針(簡稱成員函數(shù)指針)指向數(shù)據(jù)成員的指針(簡稱數(shù)據(jù)成員指針).3.指向類成員的指針類實例化后,類中的數(shù)據(jù)成員和成員函數(shù)在233.指向類成員的指針數(shù)據(jù)成員指針的聲明形式如下:

數(shù)據(jù)類型類名::*數(shù)據(jù)成員指針名對于數(shù)據(jù)成員指針,賦值的形式如下:

據(jù)成員指針名=&類名::數(shù)據(jù)成員名對象名.*類成員指針名

對象指針名->*類成員指針名

.3.指向類成員的指針數(shù)據(jù)成員指針的聲明形式如下:.243.指向類成員的指針P112例5-6.3.指向類成員的指針P112例5-6.255.1.5void和const指針指向void類型的指針稱為void指針聲明指針時,可以用關(guān)鍵字const進(jìn)行修飾,用關(guān)鍵字const修飾的指針稱為const指針.5.1.5void和const指針指向void類型的指針261.void指針不同類型指針間的賦值是錯誤的void指針是一個特例,它可以指向任何類型的C++數(shù)據(jù)。也即可以用任一類型的指針直接給void指針賦值。如果需要將void指針的值賦給其他類型的指針,則需要進(jìn)行強制類型轉(zhuǎn)換P113例5-7.1.void指針不同類型指針間的賦值是錯誤的.272.const指針在用關(guān)鍵字const修飾指針時,關(guān)鍵字const可以放在指針類型前或“*”號與指針名之間,甚至可以在上述兩個地方都加(1)關(guān)鍵字const放在指針類型前,是聲明一個指向常量的指針。程序中不能通過指針來改變它所指向的值,但指針本身的值可以改變,即指針可以指向其他數(shù)據(jù).2.const指針在用關(guān)鍵字const修飾指針時,關(guān)鍵字c282.const指針(2)關(guān)鍵字const放在“*”和指針名之間,是聲明一個指針常量(也稱常指針)。指針本身的值不可改變,即不能再指向其他數(shù)據(jù),但它指向的數(shù)據(jù)的值可以改變(3)關(guān)鍵字const在上述兩個地方都加,則是聲明一個指向常量的指針常量,指針本身的值不可改變,它所指向的數(shù)據(jù)的值也不能通過指針改變.2.const指針(2)關(guān)鍵字const放在“*”和指針名292.const指針在const指針指向一個對象時,必須注意,如果這個指針是一個指向常量的指針,那么通過這個指針就只能調(diào)用對象的const成員函數(shù)聲明對象為常對象時,實際上間接聲明了這個對象的成員函數(shù)this指針是指向常對象的指針,即constthis指針。通過這個this指針也就只能調(diào)用const成員函數(shù)對于能說明為常量的情形,應(yīng)該盡量用關(guān)鍵字const修飾.2.const指針在const指針指向一個對象時,必須注意305.2動態(tài)內(nèi)存分配所占內(nèi)存分類靜態(tài)存儲區(qū)程序運行開始時分配的存儲空間棧局部變量在棧中分配存儲空間堆也稱為自由存儲單元,動態(tài)內(nèi)存分配就是在堆中進(jìn)行.5.2動態(tài)內(nèi)存分配所占內(nèi)存分類.315.2動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配是指在程序運行期間根據(jù)實際需要隨時申請內(nèi)存,并在不需要時釋放動態(tài)內(nèi)存分配時需要使用運算符new和運算符delete,相應(yīng)地我們把申請和釋放內(nèi)存的過程稱作創(chuàng)建和刪除.5.2動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配是指在程序運行期間根據(jù)實際325.2.1運算符new運算符new用于申請所需的內(nèi)存單元指針=new數(shù)據(jù)類型關(guān)鍵字new的作用是在堆中為程序申請指定數(shù)據(jù)類型所需的內(nèi)存單元,也即在堆中創(chuàng)建該類型的變量。若創(chuàng)建成功,則返回返回一個指向所分配內(nèi)存首地址的指針;否則,返回一個空指針。new運算的返回值必須賦給程序中聲明的指針.5.2.1運算符new運算符new用于申請所需的內(nèi)存單元335.2.1運算符newint*p;p=newint;創(chuàng)建一個int型變量,返回值保存在指針p中創(chuàng)建成功后,可以使用這個指針。比如:*p=1;創(chuàng)建失敗,返回空指針實際編程時,應(yīng)該首先檢查new運算的返回值是否為0,以判斷創(chuàng)建是否成功.5.2.1運算符newint*p;.345.2.1運算符new動態(tài)創(chuàng)建變量時,也可以對創(chuàng)建的變量初始化可以用動態(tài)內(nèi)存分配在堆中創(chuàng)建對象在堆中創(chuàng)建對象時,系統(tǒng)也會自動調(diào)用相應(yīng)的構(gòu)造函數(shù).5.2.1運算符new動態(tài)創(chuàng)建變量時,也可以對創(chuàng)建的變量355.2.1運算符new在堆中也可以創(chuàng)建數(shù)組指針=new數(shù)據(jù)類型[下標(biāo)表達(dá)式]在堆中創(chuàng)建數(shù)組時,不能對數(shù)組中的元素初始化。因此,如果需要動態(tài)創(chuàng)建對象數(shù)組,相應(yīng)的類聲明中必須有無需實參調(diào)用的構(gòu)造函數(shù).5.2.1運算符new在堆中也可以創(chuàng)建數(shù)組.365.2.2運算符delete當(dāng)程序中不再需要使用運算符new申請到的某個內(nèi)存時單元時,就必須用運算符delete來釋放它delete指針名; delete[]指針名;.5.2.2運算符delete當(dāng)程序中不再需要使用運算符n375.2.2運算符deleteint*p=newint;*p=2;p=newintint*p=newint;*p=2;deletep;p=newint;.5.2.2運算符deleteint*p=newint385.2.2運算符delete如果某一指針指向動態(tài)分配的內(nèi)存,在指針退出作用域前,沒有釋放它指向的內(nèi)存,也會產(chǎn)生內(nèi)存遺漏問題對應(yīng)于每次使用運算符new,一般都應(yīng)該相應(yīng)地使用運算符delete來釋放申請的內(nèi)存,對應(yīng)于每個運算符new,只能調(diào)用一次delete來釋放內(nèi)存.5.2.2運算符delete如果某一指針指向動態(tài)分配的內(nèi)395.2.2運算符delete利用指針釋放其指向的內(nèi)存單元后,沒有對這個指針再次調(diào)用new來使之指向其他有效內(nèi)存,而又進(jìn)行delete操作,有可能導(dǎo)致程序崩潰。對空指針進(jìn)行delete操作是安全的,每次delete操作后,給相應(yīng)的指針賦0.5.2.2運算符delete利用指針釋放其指向的內(nèi)存單元405.2運算符new和deleteP118例5-8P119例5-9保持與C語言的兼容性,保留了C語言中用于動態(tài)內(nèi)存分配的兩個庫函數(shù):malloc()(與運算符new功能類似)和free()(與運算符delete功能類似).5.2運算符new和deleteP118例5-8.415.3指針與數(shù)組數(shù)組名表示的是該數(shù)組的首地址值,是指向數(shù)組第一個元素的指針常量數(shù)組名是一個指針常量,其值不可改變。在使用增1或減1運算訪問數(shù)組元素時,不能直接利用數(shù)組名,必須另外聲明一個指向數(shù)組某個元素的指針.5.3指針與數(shù)組數(shù)組名表示的是該數(shù)組的首地址值,是指向數(shù)425.3指針與數(shù)組假設(shè)一個二維數(shù)組:intx[2][3];則數(shù)組中的元素x[i][j]有多種訪問方法,以下是其中的一部分: *(*(x+i)+j)*(x[i]+j)(*(x+i))[j]*(x[0]+3*i+j).5.3指針與數(shù)組假設(shè)一個二維數(shù)組:intx[2][3]435.4指針與函數(shù)傳值調(diào)用減少了主調(diào)函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)依賴,被調(diào)函數(shù)對形參值的任何改變不會影響到實參。利用指針,形參的改變對相應(yīng)的實參有效.5.4指針與函數(shù)傳值調(diào)用減少了主調(diào)函數(shù)與被調(diào)函數(shù)之445.4.1指針作為函數(shù)的參數(shù)函數(shù)的某個參數(shù)是指針,對這個函數(shù)的調(diào)用就是傳址調(diào)用在進(jìn)行傳址調(diào)用時,函數(shù)的實參傳遞給形參的是一個地址,從而使得形參指針和實參指針指向同一個地址。被調(diào)函數(shù)中對形參指針?biāo)赶虻牡刂分袃?nèi)容的任何改變都會影響到實參.5.4.1指針作為函數(shù)的參數(shù)函數(shù)的某個參數(shù)是指針,對這個455.4.1指針作為函數(shù)的參數(shù)P125例5-13#include<iostream.h>voidswap(int*a,int*b);intmain(void).5.4.1指針作為函數(shù)的參數(shù)P125例5-13.465.4.1指針作為函數(shù)的參數(shù){intx(1),y(2);cout<<″Inmainfunction″<<endl;cout<<″Beforeswap:″;cout<<″x=″<<x<<′\t′<<″y=″<<y<<endl;swap(&x,&y);cout<<″Inmainfunction:″<<endl;cout<<″Afterswap:″;cout<<″x=″<<x<<′\t′<<″y=″<<y<<endl;return0;}.5.4.1指針作為函數(shù)的參數(shù){.475.4.1指針作為函數(shù)的參數(shù)voidswap(int*a,int*b){inttemp;cout<<″InSwapfunction:″<<endl;cout<<″Beforeswap:″;cout<<″*a=″<<*a<<′\t′<<″*b=″<<*b<<endl;temp=*a;*a=*b;.5.4.1指針作為函數(shù)的參數(shù)voidswap(int485.4.1指針作為函數(shù)的參數(shù)*b=temp;cout<<″Afterswap:″;cout<<″*a=″<<*a<<′\t′<<″*b=″<<*b<<endl;}.5.4.1指針作為函數(shù)的參數(shù)*b=temp;.495.4.1指針作為函數(shù)的參數(shù)Inmainfunction:Beforeswap:x=1y=2Inswapfunction:Beforeswap:*a=1*b=2Afterswap:*a=2*b=1Inmainfunction:Afterswap:x=2y=1.5.4.1指針作為函數(shù)的參數(shù)Inmainfuncti505.4.2.返回指針的函數(shù)當(dāng)一個函數(shù)的返回值是指針時,通過返回的指針中存儲的地址值,主調(diào)函數(shù)就能訪問相應(yīng)內(nèi)存中存放的數(shù)據(jù),還能通過指針?biāo)阈g(shù)運算訪問這個地址前后內(nèi)存中的值定義返回指針的函數(shù)的函數(shù)頭一般形式如下:

數(shù)據(jù)類型*函數(shù)名(參數(shù)表).5.4.2.返回指針的函數(shù)當(dāng)一個函數(shù)的返回值是指針時,通過515.4.3函數(shù)指針函數(shù)名是一個指向函數(shù)首地址的指針常量??梢月暶饕粋€指向函數(shù)的指針,并使用該指針來調(diào)用函數(shù)。指向函數(shù)的指針通常簡稱為函數(shù)指針數(shù)據(jù)類型(*指針名)(參數(shù)表);.5.4.3函數(shù)指針函數(shù)名是一個指向函數(shù)首地址的指針常量。525.4.3函數(shù)指針聲明的函數(shù)指針可以指向一個函數(shù)的首地址,該函數(shù)的返回值類型和形參表都必須與上述聲明中指定的相同int(*pfun)(int,int);使用函數(shù)指針時,必須先賦值

函數(shù)指針名=函數(shù)名.5.4.3函數(shù)指針聲明的函數(shù)指針可以指向一個函數(shù)的首地址53類型表達(dá)式數(shù)據(jù)類型(*函數(shù)指針名[常量表達(dá)式])(參數(shù)表);.類型表達(dá)式.54類成員函數(shù)指針類函數(shù)成員的函數(shù)指針(簡稱類成員函數(shù)指針)的一般聲明形式如下:

數(shù)據(jù)類型(類名::*指針名)(參數(shù)表);給成員函數(shù)指針賦值的一般形式如下:

指針名=類名::成員函數(shù)名.類成員函數(shù)指針類函數(shù)成員的函數(shù)指針(簡稱類成員函數(shù)指針55類成員函數(shù)指針成員函數(shù)指針也可以保存在數(shù)組中,即可以聲明成員函數(shù)指針數(shù)組

數(shù)據(jù)類型(類名::*指針名[常量表達(dá)式])(參數(shù)表);.類成員函數(shù)指針成員函數(shù)指針也可以保存在數(shù)組中,即可以聲明成員56類成員函數(shù)指針利用成員函數(shù)指針時,由于需要通過相應(yīng)的對象,為了與類的成員函數(shù)相區(qū)別,“*”號則不可省略在使用指向靜態(tài)成員的指針時,只需使用普通指針。由于靜態(tài)成員是在類中說明的,在將靜態(tài)成員的地址賦給指針時,還要用類名限定.類成員函數(shù)指針利用成員函數(shù)指針時,由于需要通過相應(yīng)的對象,為575.4.4帶參數(shù)的主函數(shù)main()C++語言允許main函數(shù)帶有參數(shù)。其中的參數(shù)用來存放用戶輸入的命令行參數(shù),以便在程序中進(jìn)行處理帶有參數(shù)的main函數(shù)的函數(shù)頭形式如下:數(shù)據(jù)類型main(intargc,char*argv[]).5.4.4帶參數(shù)的主函數(shù)main()C++語言允許mai585.4.4帶參數(shù)的主函數(shù)main()第一個參數(shù)用來存放命令行參數(shù)的個數(shù)(包括命令字,如DIR)第二個參數(shù)用來存放命令行中的命令字及各個參數(shù)的字符串

argv[0]存放命令字 argv[1]存放第一個參數(shù) argv[2]存放第二個參數(shù) ….5.4.4帶參數(shù)的主函數(shù)main()第一個參數(shù)用來存放命595.5字符串處理函數(shù)可以直接以字符串作為參數(shù),定義通用的字符串處理函數(shù),供調(diào)用strcat(連接)、strcpy(復(fù)制)、strcmp(比較)、strlen(求長度)、strlwr(轉(zhuǎn)換為小寫)、strupr(轉(zhuǎn)換為大寫)頭文件string.h.5.5字符串處理函數(shù)可以直接以字符串作為參數(shù),定義通用的605.5字符串處理函數(shù)#include<iostream.h>#include<string.h>intmain(){ chars1[40],s2[40]; chars3[80]; cout<<"請輸入一個字符串:"; cin>>s1; cout<<"請輸入另一個字符串:"; cin>>s2; strcpy(s3,s1); //將字符串s1拷貝至s3 strcat(s3,s2); //將字符串s2連到s3之后 cout<<"合并字符串后為:"<<s3; cout<<endl; return0;}.5.5字符串處理函數(shù)#include<iostream.615.6引用引用是一個別名。聲明引用的過程是為某個變量建立別名的過程(也稱某個變量被引用)

數(shù)據(jù)類型&引用名=變量名;

數(shù)據(jù)類型&引用名(變量名);.5.6引用引用是一個別名。聲明引用的過程是為某個變量建立625.6引用P189例5-24#include<iostream.h>intmain(){inta(0);int&ra=a;cout<<″a=″<<a<<endl;cout<<″ra=″<<ra<<endl;ra=2;cout<<″a=″<<a<<endl;cout<<″ra=″<<ra<<endl;cout<<″&a=″<<&a<<endl;cout<<″&ra=″<<&ra<<endl;return0;}.5.6引用P189例5-24.635.6引用a=0ra=0a=2ra=2&a=0x0065FDF4&ra=0x0065FDF4

引用初始化后其值不能改變,即不允許把為一個變量建立的引用重新用作另一變量的別名.5.6引用a=0.645.7.1把引用用作函數(shù)參數(shù)#include<iostream.h>voidswap(int&a,int&b);intmain(void){intx(1),y(2);cout<<″Inmainfunction″<<endl;cout<<″Beforeswap:″;cout<<″x=″<<x<<′\t′<<″y=″<<y<<endl;swap(x,y);cout<<″Inmainfunction:″<<endl;cout<<″Afterswap:″;cout<<″x=″<<x<<′\t′<<″y=″<<y<<endl;return0;}

.5.7.1把引用用作函數(shù)參數(shù)#include<iostr655.7.1把引用用作函數(shù)參數(shù)voidswap(int&a,int&b){inttemp;cout<<″InSwapfunction:″<<endl;cout<<″Beforeswap:″;cout<<″a=″<<a<<′\t′<<″b=″<<b<<endl;temp=a;a=b;b=temp;cout<<″Afterswap:″;cout<<″a=″<<a<<′\t′<<″b=″<<b<<endl;}.5.7.1把引用用作函數(shù)參數(shù)voidswap(int665.7.1把引用用作函數(shù)參數(shù)Inmainfunction:Beforeswap:x=1y=2Inswapfunction:Beforeswap:a=1b=2Afterswap:a=2b=1Inmainfunction:Afterswap:x=2y=1.5.7.1把引用用作函數(shù)參數(shù)Inmainfuncti675.7.2返回引用的函數(shù)函數(shù)可以返回引用,必須注意,引用只是一個別名,絕對不能返回不在作用域內(nèi)的對象的引用.5.7.2返回引用的函數(shù)函數(shù)可以返回引用,必須注意685.7.2返回引用的函數(shù)#include<iostream.h>int&fun(int&i);intmain(){inta;cout<<fun(a)<<endl;return0;}int&fun(int&i){i=2;returni;}.5.7.2返回引用的函數(shù)#include<iostrea695.7.3拷貝構(gòu)造函數(shù)與對象的引用調(diào)用拷貝構(gòu)造函數(shù)是類的一個公有成員函數(shù)。函數(shù)名與構(gòu)造函數(shù)一樣,也是它所屬類的類名。它只有一個參數(shù),且參數(shù)是同類的一個對象的引用拷貝構(gòu)造函數(shù)并不改變從主調(diào)函數(shù)傳遞來的對象,函數(shù)中的參數(shù)最好聲明為常引用。常引用所引用的對象的值不能通過常引用改變在遇到以同類的對象為實參來聲明另一個對象的情況時,類中沒有顯式定義拷貝構(gòu)造函數(shù),就自動調(diào)用默認(rèn)的拷貝構(gòu)造函數(shù)。將作為實參的對象的每個數(shù)據(jù)成員復(fù)制給新聲明的對象相應(yīng)成員。稱這種拷貝為淺拷貝.5.7.3拷貝構(gòu)造函數(shù)與對象的引用調(diào)用拷貝構(gòu)造函數(shù)是類的70拷貝構(gòu)造函數(shù)class類名{...類名(類名&對象名)//拷貝構(gòu)造函數(shù)…};類名::類名(類名&對象名)//實現(xiàn)拷貝構(gòu)造函數(shù),也可在類中定義{函數(shù)體}.拷貝構(gòu)造函數(shù)class類名.71P142例5-27#include<iostream.h>classA{public:A(inta=0){cout<<″調(diào)用構(gòu)造函數(shù)″<<endl;x=a;}A(constA&a){cout<<″調(diào)用拷貝構(gòu)造函數(shù)″<<endl;x=a.x;}.P142例5-27#include<iostream.h>.72P142例5-27~A(){}voidoutputx(){cout<<″x=″<<x<<endl;}private:intx;};intmain(){Aa1(2);//以值為實參聲明對象,將調(diào)用構(gòu)造函數(shù)a1.outputx();Aa2(a1);//以同類的對象為實象聲明對象,將調(diào)用拷貝構(gòu)造函數(shù)a2.outputx();return0;}

.P142例5-27~A(){}.73P142例5-27調(diào)用構(gòu)造函數(shù)x=2調(diào)用拷貝構(gòu)造函數(shù)x=2.P142例5-27調(diào)用構(gòu)造函數(shù).74深拷貝和淺拷貝淺拷貝只是把一個對象的全部數(shù)據(jù)成員的值一一對應(yīng)地拷貝給新聲明的對象兩個對象中對應(yīng)的指針指向了同一塊內(nèi)存。當(dāng)其中的任何一個對象退出作用域時,析構(gòu)函數(shù)將刪除這塊內(nèi)存,而尚未退出作用域的對象中指針卻仍指向它。這種指針稱它為虛指針.深拷貝和淺拷貝淺拷貝只是把一個對象的全部數(shù)據(jù)成員的值一一對應(yīng)75深拷貝和淺拷貝程序中自定義拷貝構(gòu)造函數(shù),為對象中的指針成員申請必要的內(nèi)存以進(jìn)行深拷貝。所謂深拷貝就是在成功分配內(nèi)存后,把被復(fù)制對象的指針指向內(nèi)存中的值拷貝到新申請的內(nèi)存中P143例5-28.深拷貝和淺拷貝程序中自定義拷貝構(gòu)造函數(shù),為對象中的指針成員申76利用引用調(diào)用提高程序的效率采用傳址或引用調(diào)用,函數(shù)中傳遞的是對象的地址,不需要為對象臨時建立一個副本,程序的效率將會提高

P144例5-29.利用引用調(diào)用提高程序的效率采用傳址或引用調(diào)用,函數(shù)中傳775.8指針與引用引用不可以是空引用。如果對象有可能為空時,就必須采用指針。引用本身不能重新賦值。如果程序需要先指向一個對象,后又指向另一對象,也應(yīng)該采用指.5.8指針與引用引用不可以是空引用。如果對象有可能為空時78P146例5-30#include<iostream.h>#include<stdlib.h>int&fun();intmain(){int&rp=fun();int*p=&rp;cout<<rp;deletep;//釋放內(nèi)存后,引用rp是一個空引用return0;}.P146例5-30#include<iostream.h>.79P146例5-30int&fun(){int*p=newint;if(p==0){ cout<<"內(nèi)存分配錯誤"<<endl; exit(1); //系統(tǒng)函數(shù),用于終止程序的運行}int&rp=*p;rp=5;returnrp;}.P146例5-30int&fun().80第5章指針與引用.第5章指針與引用.81第5章指針與引用指針動態(tài)內(nèi)存分配指針與數(shù)組指針與函數(shù)字符串處理函數(shù)引用引用與函數(shù)指針與引用.第5章指針與引用指針.825.1指針指針是C++語言從C語言中繼承來的重要概念,是C++語言最重要的特色之一。指針的正確使用是C++語言的學(xué)習(xí)重點之一.5.1指針指針是C++語言從C語言中繼承來的重要概835.1.1數(shù)據(jù)存儲計算機內(nèi)存劃分為內(nèi)存單元,這些內(nèi)存單元按其順序進(jìn)行編址。程序運行時,系統(tǒng)將利用內(nèi)存存儲相關(guān)的數(shù)據(jù)數(shù)據(jù)在內(nèi)存中的存儲方式是:按其所屬的數(shù)據(jù)類型,占據(jù)一定數(shù)量的連續(xù)內(nèi)存單元程序中的每個變量在其生存期內(nèi)存儲的位置是不變的,具有固定的存儲地址.5.1.1數(shù)據(jù)存儲計算機內(nèi)存劃分為內(nèi)存單元,這些內(nèi)存單元845.1.1數(shù)據(jù)存儲C++程序運行時,系統(tǒng)會自動地根據(jù)變量數(shù)據(jù)類型為該變量分配相應(yīng)的內(nèi)存。必要時可以使用取地址運算符“&”來獲取變量的地址#include<iostream.h>intmain(){inti=1;cout<<″i=\t″<<i<<″\tTheaddressofit:\t″<<&i<<endl;return0;}.5.1.1數(shù)據(jù)存儲C++程序運行時,系統(tǒng)會自動地855.1.2指針的聲明及使用指針是用于存放內(nèi)存地址的變量??梢詫⒆兞康牡刂繁4嬖谥羔樦兄羔樖且粋€變量,必須先聲明,后使用

數(shù)據(jù)類型*標(biāo)識符;列出的數(shù)據(jù)類型并不是指針變量本身的類型,而是指針用于保存的地址值中存儲的變量的數(shù)據(jù)類型,即指針?biāo)赶蜃兞康臄?shù)據(jù)類型.5.1.2指針的聲明及使用指針是用于存放內(nèi)存地址的變量。865.1.2指針的聲明及使用任一指針變量本身數(shù)據(jù)值的類型都是unsignedlongint指針也可以和其他變量同時聲明使用指針前,必須首先給它賦一個合法的值。否則,程序中對指針的訪問有可能導(dǎo)致系統(tǒng)崩潰值為0的指針叫空指針.5.1.2指針的聲明及使用任一指針變量本身數(shù)據(jù)值的類型都875.1.2指針的聲明及使用如果在聲明時,指針初始化為0或根本沒有初始化,使用前,就必須首先給它賦有意義的值inti,*p1;p1=&i;.5.1.2指針的聲明及使用如果在聲明時,指針初始化為0或885.1.2指針的聲明及使用數(shù)組名表示的是該數(shù)組的首地址值intx[5],*px=x;intx[5],px=&x[0];inti,*p1=i;double*p2=&i;確實需要用不同類型變量的地址給指針賦值,就應(yīng)該采用強制類型轉(zhuǎn)換double*p2=(double*)&i.5.1.2指針的聲明及使用數(shù)組名表示的是該數(shù)組的首地址值895.1.2指針的聲明及使用每個變量在內(nèi)存中都有一個固定的地址,而指針中保存的就是變量的地址值。如果聲明一個指針,并使其值為某個變量的地址,就可以通過這個指針間接地訪問該變量利用指針來訪問變量需要使用間接訪問運算符“*”inti=1,*p=&i; cout<<*p;*p=2;cout<<*p;通過“*”運算訪問目的數(shù)據(jù)的過程也稱為“間接尋址”過程.5.1.2指針的聲明及使用每個變量在內(nèi)存中都有一個固定的905.1.2指針的聲明及使用P105例5-2.5.1.2指針的聲明及使用P105例5-2.915.1.2指針的聲明及使用指針是一個變量,在內(nèi)存中也需占據(jù)一定的空間,具有一個地址,這個地址也可以利用指針來保存聲明一個指針來指向它,這個指針稱為指向指針的指針,也即二級指針

數(shù)據(jù)類型**標(biāo)識符inti,*p=&iint**pp=&p;.5.1.2指針的聲明及使用指針是一個變量,在內(nèi)存中也需占925.1.2指針的聲明及使用P106例5-3#include<iostream.h>intmain(){inti;int*p=&i,**pp=&p;i=1;cout<<″i=\t″<<i<<endl;cout<<″*p=\t″<<*p<<endl;cout<<″p=\t″<<p<<endl;cout<<″*pp=\t″<<*pp<<endl;cout<<″**pp=\t″<<**pp<<endl;return0;}.5.1.2指針的聲明及使用P106例5-3.935.1.3指針運算指針是一個變量,它的值是一個地址。它只能參與賦值、算術(shù)及關(guān)系運算算術(shù)運算指針可以和整數(shù)進(jìn)行加減運算,包括增1和減1運算指針的算術(shù)運算與一般的數(shù)值計算不同,它不是簡單地將指針的值加上或減去給定的整數(shù)值,而是與指針?biāo)赶蜃兞康念愋陀嘘P(guān)指針加n的實際操作是使指針中的地址值加上sizeof(數(shù)據(jù)類型)*n指針減n的實際操作是使指針中的地址值減去sizeof(數(shù)據(jù)類型)*n.5.1.3指針運算指針是一個變量,它的值是一個地址。它只945.1.3指針運算指針加減運算一般用在對數(shù)組元素進(jìn)行操作的場合數(shù)組是連續(xù)存儲的,通過對指向數(shù)組的指針進(jìn)行加減運算,使指針指向數(shù)組中不同的元素。對指向普通變量的指針進(jìn)行加減運算后,指針?biāo)赶虻牡刂返挠猛臼遣淮_定如果兩個指針?biāo)赶虻淖兞款愋拖嗤?,也可以對它們進(jìn)行如下減法運算運算結(jié)果是一個整數(shù)值,它的絕對值就是兩個指針?biāo)赶虻牡刂分g相隔數(shù)據(jù)的個數(shù).5.1.3指針運算指針加減運算一般用在對數(shù)組元素進(jìn)行操作955.1.3指針運算關(guān)系運算指針的關(guān)系運算一般是在指向相同類型變量的指針之間進(jìn)行其他關(guān)系運算比較的也是兩個指針?biāo)赶虻牡刂分档拇笮?。一般用在對?shù)組進(jìn)行操作的場合.5.1.3指針運算關(guān)系運算.965.1.4與對象有關(guān)的指針指針可以指向任一類型的變量,也可以指向?qū)ο舐暶饕粋€指針來保存對象的地址,這個指針就是指向?qū)ο蟮闹羔?,簡稱對象的指針.5.1.4與對象有關(guān)的指針指針可以指向任一類型的變量,也971.對象的指針對象的指針的聲明方法與普通變量的指針相同類名*對象的指針名通過對象的指針間接訪問對象成員的方式相應(yīng)地表示為:(*對象的指針名).數(shù)據(jù)成員名(*對象的指針名).成員函數(shù)名(參數(shù)表).1.對象的指針對象的指針的聲明方法與普通變量的指針相同.981.對象的指針C++語言提供了另一個更常用的方法對象的指針名->數(shù)據(jù)成員名對象的指針名->成員函數(shù)名(參數(shù)表)“->”也叫做成員選擇運算符,該運算符用于通過對象的指針訪問對象成員.1.對象的指針C++語言提供了另一個更常用的方法.991.對象的指針P108例5-4.1.對象的指針P108例5-4.1002.this指針this指針也是一個指向?qū)ο蟮闹羔?,它隱含在類成員函數(shù)中,用來指向成員函數(shù)所屬類的正在被操作的對象調(diào)用一個對象的成員函數(shù)時,系統(tǒng)會首先將這個對象的地址賦給被調(diào)用成員函數(shù)中的this指針。成員函數(shù)訪問數(shù)據(jù)成員時,就隱含地使用this指針來確保訪問到的數(shù)據(jù)成員屬于這個對象靜態(tài)成員函數(shù)沒有this指針.2.this指針this指針也是一個指向?qū)ο蟮闹羔?,它隱1012.this指針P110例5-5.2.this指針P110例5-5.1023.指向類成員的指針類實例化后,類中的數(shù)據(jù)成員和成員函數(shù)在內(nèi)存中也有一定的存儲地址,可以聲明指向類成員的指針。通過這些指針,可以訪問對象的成員指向成員函數(shù)的指針(簡稱成員函數(shù)指針)指向數(shù)據(jù)成員的指針(簡稱數(shù)據(jù)成員指針).3.指向類成員的指針類實例化后,類中的數(shù)據(jù)成員和成員函數(shù)在1033.指向類成員的指針數(shù)據(jù)成員指針的聲明形式如下:

數(shù)據(jù)類型類名::*數(shù)據(jù)成員指針名對于數(shù)據(jù)成員指針,賦值的形式如下:

據(jù)成員指針名=&類名::數(shù)據(jù)成員名對象名.*類成員指針名

對象指針名->*類成員指針名

.3.指向類成員的指針數(shù)據(jù)成員指針的聲明形式如下:.1043.指向類成員的指針P112例5-6.3.指向類成員的指針P112例5-6.1055.1.5void和const指針指向void類型的指針稱為void指針聲明指針時,可以用關(guān)鍵字const進(jìn)行修飾,用關(guān)鍵字const修飾的指針稱為const指針.5.1.5void和const指針指向void類型的指針1061.void指針不同類型指針間的賦值是錯誤的void指針是一個特例,它可以指向任何類型的C++數(shù)據(jù)。也即可以用任一類型的指針直接給void指針賦值。如果需要將void指針的值賦給其他類型的指針,則需要進(jìn)行強制類型轉(zhuǎn)換P113例5-7.1.void指針不同類型指針間的賦值是錯誤的.1072.const指針在用關(guān)鍵字const修飾指針時,關(guān)鍵字const可以放在指針類型前或“*”號與指針名之間,甚至可以在上述兩個地方都加(1)關(guān)鍵字const放在指針類型前,是聲明一個指向常量的指針。程序中不能通過指針來改變它所指向的值,但指針本身的值可以改變,即指針可以指向其他數(shù)據(jù).2.const指針在用關(guān)鍵字const修飾指針時,關(guān)鍵字c1082.const指針(2)關(guān)鍵字const放在“*”和指針名之間,是聲明一個指針常量(也稱常指針)。指針本身的值不可改變,即不能再指向其他數(shù)據(jù),但它指向的數(shù)據(jù)的值可以改變(3)關(guān)鍵字const在上述兩個地方都加,則是聲明一個指向常量的指針常量,指針本身的值不可改變,它所指向的數(shù)據(jù)的值也不能通過指針改變.2.const指針(2)關(guān)鍵字const放在“*”和指針名1092.const指針在const指針指向一個對象時,必須注意,如果這個指針是一個指向常量的指針,那么通過這個指針就只能調(diào)用對象的const成員函數(shù)聲明對象為常對象時,實際上間接聲明了這個對象的成員函數(shù)this指針是指向常對象的指針,即constthis指針。通過這個this指針也就只能調(diào)用const成員函數(shù)對于能說明為常量的情形,應(yīng)該盡量用關(guān)鍵字const修飾.2.const指針在const指針指向一個對象時,必須注意1105.2動態(tài)內(nèi)存分配所占內(nèi)存分類靜態(tài)存儲區(qū)程序運行開始時分配的存儲空間棧局部變量在棧中分配存儲空間堆也稱為自由存儲單元,動態(tài)內(nèi)存分配就是在堆中進(jìn)行.5.2動態(tài)內(nèi)存分配所占內(nèi)存分類.1115.2動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配是指在程序運行期間根據(jù)實際需要隨時申請內(nèi)存,并在不需要時釋放動態(tài)內(nèi)存分配時需要使用運算符new和運算符delete,相應(yīng)地我們把申請和釋放內(nèi)存的過程稱作創(chuàng)建和刪除.5.2動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配是指在程序運行期間根據(jù)實際1125.2.1運算符new運算符new用于申請所需的內(nèi)存單元指針=new數(shù)據(jù)類型關(guān)鍵字new的作用是在堆中為程序申請指定數(shù)據(jù)類型所需的內(nèi)存單元,也即在堆中創(chuàng)建該類型的變量。若創(chuàng)建成功,則返回返回一個指向所分配內(nèi)存首地址的指針;否則,返回一個空指針。new運算的返回值必須賦給程序中聲明的指針.5.2.1運算符new運算符new用于申請所需的內(nèi)存單元1135.2.1運算符newint*p;p=newint;創(chuàng)建一個int型變量,返回值保存在指針p中創(chuàng)建成功后,可以使用這個指針。比如:*p=1;創(chuàng)建失敗,返回空指針實際編程時,應(yīng)該首先檢查new運算的返回值是否為0,以判斷創(chuàng)建是否成功.5.2.1運算符newint*p;.1145.2.1運算符new動態(tài)創(chuàng)建變量時,也可以對創(chuàng)建的變量初始化可以用動態(tài)內(nèi)存分配在堆中創(chuàng)建對象在堆中創(chuàng)建對象時,系統(tǒng)也會自動調(diào)用相應(yīng)的構(gòu)造函數(shù).5.2.1運算符new動態(tài)創(chuàng)建變量時,也可以對創(chuàng)建的變量1155.2.1運算符new在堆中也可以創(chuàng)建數(shù)組指針=new數(shù)據(jù)類型[下標(biāo)表達(dá)式]在堆中創(chuàng)建數(shù)組時,不能對數(shù)組中的元素初始化。因此,如果需要動態(tài)創(chuàng)建對象數(shù)組,相應(yīng)的類聲明中必須有無需實參調(diào)用的構(gòu)造函數(shù).5.2.1運算符new在堆中也可以創(chuàng)建數(shù)組.1165.2.2運算符delete當(dāng)程序中不再需要使用運算符new申請到的某個內(nèi)存時單元時,就必須用運算符delete來釋放它delete指針名; delete[]指針名;.5.2.2運算符delete當(dāng)程序中不再需要使用運算符n1175.2.2運算符deleteint*p=newint;*p=2;p=newintint*p=newint;*p=2;deletep;p=newint;.5.2.2運算符deleteint*p=newint1185.2.2運算符delete如果某一指針指向動態(tài)分配的內(nèi)存,在指針退出作用域前,沒有釋放它指向的內(nèi)存,也會產(chǎn)生內(nèi)存遺漏問題對應(yīng)于每次使用運算符new,一般都應(yīng)該相應(yīng)地使用運算符delete來釋放申請的內(nèi)存,對應(yīng)于每個運算符new,只能調(diào)用一次delete來釋放內(nèi)存.5.2.2運算符delete如果某一指針指向動態(tài)分配的內(nèi)1195.2.2運算符delete利用指針釋放其指向的內(nèi)存單元后,沒有對這個指針再次調(diào)用new來使之指向其他有效內(nèi)存,而又進(jìn)行delete操作,有可能導(dǎo)致程序崩潰。對空指針進(jìn)行delete操作是安全的,每次delete操作后,給相應(yīng)的指針賦0.5.2.2運算符delete利用指針釋放其指向的內(nèi)存單元1205.2運算符new和deleteP118例5-8P119例5-9保持與C語言的兼容性,保留了C語言中用于動態(tài)內(nèi)存分配的兩個庫函數(shù):malloc()(與運算符new功能類似)和free()(與運算符delete功能類似).5.2運算符new和deleteP118例5-8.1215.3指針與數(shù)組數(shù)組名表示的是該數(shù)組的首地址值,是指向數(shù)組第一個元素的指針常量數(shù)組名是一個指針常量,其值不可改變。在使用增1或減1運算訪問數(shù)組元素時,不能直接利用數(shù)組名,必須另外聲明一個指向數(shù)組某個元素的指針.5.3指針與數(shù)組數(shù)組名表示的是該數(shù)組的首地址值,是指向數(shù)1225.3指針與數(shù)組假設(shè)一個二維數(shù)組:intx[2][3];則數(shù)組中的元素x[i][j]有多種訪問方法,以下是其中的一部分: *(*(x+i)+j)*(x[i]+j)(*(x+i))[j]*(x[0]+3*i+j).5.3指針與數(shù)組假設(shè)一個二維數(shù)組:intx[2][3]1235.4指針與函數(shù)傳值調(diào)用減少了主調(diào)函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)依賴,被調(diào)函數(shù)對形參值的任何改變不會影響到實參。利用指針,形參的改變對相應(yīng)的實參有效.5.4指針與函數(shù)傳值調(diào)用減少了主調(diào)函數(shù)與被調(diào)函數(shù)之1245.4.1指針作為函數(shù)的參數(shù)函數(shù)的某個參數(shù)是指針,對這個函數(shù)的調(diào)用就是傳址調(diào)用在進(jìn)行傳址調(diào)用時,函數(shù)的實參傳遞給形參的是一個地址,從而使得形參指針和實參指針指向同一個地址。被調(diào)函數(shù)中對形參指針?biāo)赶虻牡刂分袃?nèi)容的任何改變都會影響到實參.5.4.1指針作為函數(shù)的參數(shù)函數(shù)的某個參數(shù)是指針,對這個1255.4.1指針作為函數(shù)的參數(shù)P125例5-13#include<iostream.h>voidswap(int*a,int*b);intmain(void).5.4.1指針作為函數(shù)的參數(shù)P125例5-13.1265.4.1指針作為函數(shù)的參數(shù){intx(1),y(2);cout<<″Inmainfunction″<<endl;cout<<″Beforeswap:″;cout<<″x=″<<x<<′\t′<<″y=″<<y<<endl;swap(&x,&y);cout<<″Inmainfunction:″<<endl;cout<<″Afterswap:″;cout<<″x=″<<x<<′\t′<<″y=″<<y<<endl;return0;}.5.4.1指針作為函數(shù)的參數(shù){.1275.4.1指針作為函數(shù)的參數(shù)voidswap(int*a,int*b){inttemp;cout<<″InSwapfunction:″<<endl;cout<<″Beforeswap:″;cout<<″*a=″<<*a<<′\t′<<″*b=″<<*b<<endl;temp=*a;*a=*b;.5.4.1指針作為函數(shù)的參數(shù)voidswap(int1285.4.1指針作為函數(shù)的參數(shù)*b=temp;cout<<″Afterswap:″;cout<<″*a=″<<*a<<′\t′<<″*b=″<<*b<<endl;}.5.4.1指針作為函數(shù)的參數(shù)*b=temp;.1295.4.1指針作為函數(shù)的參數(shù)Inmainfunction:Beforeswap:x=1y=2Inswapfunction:Beforeswap:*a=1*b=2Afterswap:*a=2*b=1Inmainfunction:Afterswap:x=2y=1.5.4.1指針作為函數(shù)的參數(shù)Inmainfuncti1305.4.2.返回指針的函數(shù)當(dāng)一個函數(shù)的返回值是指針時,通過返回的指針中存儲的地址值,主調(diào)函數(shù)就能訪問相應(yīng)內(nèi)存中存放的數(shù)據(jù),還能通過指針?biāo)阈g(shù)運算訪問這個地址前后內(nèi)存中的值定義返回指針的函數(shù)的函數(shù)頭一般形式如下:

數(shù)據(jù)類型*函數(shù)名(參數(shù)表).5.4.2.返回指針的函數(shù)當(dāng)一個函數(shù)的返回值是指針時,通過1315.4.3函數(shù)指針函數(shù)名是一個指向函數(shù)首地址的指針常量。可以聲明一個指向函數(shù)的指針,并使用該指針來調(diào)用函數(shù)。指向函數(shù)的指針通常簡稱為函數(shù)指針數(shù)據(jù)類型(*指針名)(參數(shù)表);.5.4.3函數(shù)指針函數(shù)名是一個指向函數(shù)首地址的指針常量。1325.4.3函數(shù)指針聲明的函數(shù)指針可以指向一個函數(shù)的首地址,該函數(shù)的返回值類型和形參表都必須與上述聲明中指定的相同int(*pfun)(int,int);使用函數(shù)指針時,必須先賦值

函數(shù)指針名=函數(shù)名.5.4.3函數(shù)指針聲明的函數(shù)指針可以指向一個函數(shù)的首地址133類型表達(dá)式數(shù)據(jù)類型(*函數(shù)指針名[常量表達(dá)式])(參數(shù)表);.類型表達(dá)式.134類成員函數(shù)指針類函數(shù)成員的函數(shù)指針(簡稱類成員函數(shù)指針)的一般聲明形式如下:

數(shù)據(jù)類型(類名::*指針名)(參數(shù)表);給成員函數(shù)指針賦值的一般形式如下:

指針名=類名::成員函數(shù)名.類成員函數(shù)指針類函數(shù)成員的函數(shù)指針(簡稱類成員函數(shù)指針135類成員函數(shù)指針成員函數(shù)指針也可以保存在數(shù)組中,即可以聲明成員函數(shù)指針數(shù)組

數(shù)據(jù)類型(類名::*指針名[常量表達(dá)式])(參數(shù)表);.類成員函數(shù)指針成員函數(shù)指針也可以保存在數(shù)組中,即可以聲明成員136類成員函數(shù)指針利用成員函數(shù)指針時,由于需要通過相應(yīng)的對象,為了與類的成員函數(shù)相區(qū)別,“*”號則不可省略在使用指向靜態(tài)成員的指針時,只需使用普通指針。由于靜態(tài)成員是在類中說明的,在將靜態(tài)成員的地址賦給指針時,還要用類名限定.類成員函數(shù)指針利用成員函數(shù)指針時,由于需要通過相應(yīng)的對象,為1375.4.4帶參數(shù)的主函數(shù)main()C++語言允許main函數(shù)帶有參數(shù)。其中的參數(shù)用來存放用戶輸入的命令行參數(shù),以便在程序中進(jìn)行處理帶有參數(shù)的main函數(shù)的函數(shù)頭形式如下:數(shù)據(jù)類型main(intargc,char*argv[]).5.4.4帶參數(shù)的主函數(shù)main()C++語言允許mai1385.4.4帶參數(shù)的主函數(shù)main()第一個參數(shù)用來存放命令行參數(shù)的個數(shù)(包括命令字,如DIR)第二個參數(shù)用來存放命令行中的命令字及各個參數(shù)的字符串

argv[0]存放命令字 argv[1]存放第一個參數(shù) argv[2]存放第二個參數(shù) ….5.4.4帶參數(shù)的主函數(shù)main()第一個參數(shù)用來存放命1395.5字符串處理函數(shù)可以直接以字符串作為參數(shù),定義通用的字符串處理函數(shù),供調(diào)用strcat(連接)、strcpy(復(fù)制)、strcmp(比較)、strlen(求長度)、strlwr(轉(zhuǎn)換為小寫)、strupr(轉(zhuǎn)換為大寫)頭文件string.h.5.5字符串處理函數(shù)可以直接以字符串作為參數(shù),定義通用的1405.5字符串處理函數(shù)#include<iostream.h>#include<string.h>intmain(){ chars1[40],s2[40]; chars3[80]; cout<<"請輸入一個字符串:"; cin>>s1; cout<<"請輸入另一個字符串:"; cin>>s2; strcpy(s3,s1); //將字符串s1拷貝至s3 strcat(s3,s2); //將字符串s2連到s3之后 cout<<"合并字符串后為:"<<s3; cout<<endl; return0;}.5.5字符串處理函數(shù)#include<iostream.1415.6引用引用是一個別名。聲明引用的過程是為某個變量建立別名的過程(也稱某個變量被引用)

數(shù)據(jù)類型&引用名=變量名;

數(shù)據(jù)類型&引用名(變量名);.5.6引用引用是一個別名。聲明引用的過程是為某個變量建立1425.6引用P189例5-24#include<iostream.h>intmain(){inta(0);int&ra=a;cout<<″a=″<<a<<endl;cout<<″ra=″<<ra<<endl;ra=2;cout<<″a=″<<a<<endl;cout<<″ra=″<<ra<<endl;cout<<″&a=″<<&a<<endl;cout<<″&ra=″<<&ra<<endl;return0;}.5.6引用P189例5-24.1435.6引用a=0ra=0a=2ra=2&a=0x0065FDF4&ra=0x0065FDF4

引用初始化后其值不能改變,即不允許把為一個變量建立的引用重新用作另一變量的別名.5.6引用a=0.1445.7.1把引用用作函數(shù)參數(shù)#include<iostream.h>voidswap(int&a,int&b);intmain(void){intx(1),y(2);cout<<″Inmainfunction″<<endl;cout<<″Beforeswap:″;cout<<″x=″<<x<<′\t′<<″y=″<<y<<endl;swap(x,y);cout<<″Inmainfunction:″<<endl;cout<<″Afterswap:″;cout<<″x=″<<x<<′\t′<<″y=″<<y<<endl;return0;}

.5.7.1把引用用作函數(shù)參數(shù)#include<iostr1455.7.1把引用用作函數(shù)參數(shù)voidswap(int&a,int&b){inttemp;cout<<″InSwapfunction:″<<endl;cout<<″Beforeswap:″;cout<<″a=″<<a<<′\t′<<″b=″<<b<<endl;temp=a;a=b;b=temp;cout<<″Afterswap:″;

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論