1、指針的優(yōu)點(diǎn)
創(chuàng)新互聯(lián)是一家從事企業(yè)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、行業(yè)門(mén)戶(hù)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)制作的專(zhuān)業(yè)的建站公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁(yè)設(shè)計(jì)人員,具備各種規(guī)模與類(lèi)型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹(shù)立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來(lái)曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)數(shù)千家。
是標(biāo)識(shí)一塊內(nèi)存。電腦內(nèi)存上的每一個(gè)字節(jié)都具有一個(gè)編號(hào),稱(chēng)為地址(可以簡(jiǎn)單理解為指針),任何讀寫(xiě)內(nèi)存的指令都必須攜帶地址信息,否則電腦不知道讀寫(xiě)那塊內(nèi)存。
不管程序是用什么語(yǔ)言寫(xiě)的,要運(yùn)行數(shù)據(jù)和代碼必須駐留內(nèi)存,CPU要執(zhí)行指令必須有一個(gè)“指針”程序計(jì)數(shù)器指向內(nèi)存的代碼塊,如果某個(gè)指令要操作內(nèi)存數(shù)據(jù),該指令必須攜帶額外的地址信息。
2、指針的缺點(diǎn)
指針可以操作任何東西,所以指針很靈活、很強(qiáng)大,但也引入了復(fù)雜性。
擴(kuò)展資料
1、指針利用地址,它的值直接指向(points to)存在電腦存儲(chǔ)器中另一個(gè)地方的值。由于通過(guò)地址能找到所需的變量單元,可以說(shuō),地址指向該變量單元。
2、輸出一串字符時(shí),只需要知道它的第一個(gè)字符的地址,就可以將這個(gè)字符串輸出,而第一個(gè)字符的地址,可以用指針儲(chǔ)存。所以有n個(gè)字符串時(shí),就可以用n個(gè)指針來(lái)儲(chǔ)存。
3、為了保存一個(gè)數(shù)據(jù)在內(nèi)存中的地址,就需要指針變量。因此指針是程序數(shù)據(jù)在內(nèi)存中的地址,而指針變量是用來(lái)保存這些地址的變量。
應(yīng)該是c++中才有的,
inline 關(guān)鍵字用來(lái)定義一個(gè)類(lèi)的內(nèi)聯(lián)函數(shù),引入它的主要原因是用它替代C中表達(dá)式形式的宏定義。
表達(dá)式形式的宏定義一例:
#define ExpressionName(Var1,Var2) (Var1+Var2)*(Var1-Var2)
為什么要取代這種形式呢,且聽(tīng)我道來(lái):
1.
首先談一下在C中使用這種形式宏定義的原因,C語(yǔ)言是一個(gè)效率很高的語(yǔ)言,這種宏定義在形式及使用上像一個(gè)函數(shù),但它使用預(yù)處理器實(shí)現(xiàn),沒(méi)有了參數(shù)壓棧,代碼生成等一系列的操作,因此,效率很高,這是它在C中被使用的一個(gè)主要原因。
2.
這種宏定義在形式上類(lèi)似于一個(gè)函數(shù),但在使用它時(shí),僅僅只是做預(yù)處理器符號(hào)表中的簡(jiǎn)單替換,因此它不能進(jìn)行參數(shù)有效性的檢測(cè),也就不能享受C++編譯器嚴(yán)格類(lèi)型檢查的好處,另外它的返回值也不能被強(qiáng)制轉(zhuǎn)換為可轉(zhuǎn)換的合適的類(lèi)型,這樣,它的使用就存在著一系列的隱患和局限性。
3.
在C++中引入了類(lèi)及類(lèi)的訪(fǎng)問(wèn)控制,這樣,如果一個(gè)操作或者說(shuō)一個(gè)表達(dá)式涉及到類(lèi)的保護(hù)成員或私有成員,你就不可能使用這種宏定義來(lái)實(shí)現(xiàn)(因?yàn)闊o(wú)法將this指針?lè)旁诤线m的位置)。
4. inline 推出的目的,也正是為了取代這種表達(dá)式形式的宏定義,它消除了它的缺點(diǎn),同時(shí)又很好地繼承了它的優(yōu)點(diǎn)。
為什么inline能很好地取代表達(dá)式形式的預(yù)定義呢?
對(duì)應(yīng)于上面的1-3點(diǎn),闡述如下:
1. inline 定義的類(lèi)的內(nèi)聯(lián)函數(shù),函數(shù)的代碼被放入符號(hào)表中,在使用時(shí)直接進(jìn)行替換,(像宏一樣展開(kāi)),沒(méi)有了調(diào)用的開(kāi)銷(xiāo),效率也很高。
2.
很明顯,類(lèi)的內(nèi)聯(lián)函數(shù)也是一個(gè)真正的函數(shù),編譯器在調(diào)用一個(gè)內(nèi)聯(lián)函數(shù)時(shí),會(huì)首先檢查它的參數(shù)的類(lèi)型,保證調(diào)用正確。然后進(jìn)行一系列的相關(guān)檢查,就像對(duì)待任何一個(gè)真正的函數(shù)一樣。這樣就消除了它的隱患和局限性。
3. inline 可以作為某個(gè)類(lèi)的成員函數(shù),當(dāng)然就可以在其中使用所在類(lèi)的保護(hù)成員及私有成員。
在何時(shí)使用inline函數(shù):
首先,你可以使用inline函數(shù)完全取代表達(dá)式形式的宏定義。
另外要注意,內(nèi)聯(lián)函數(shù)一般只會(huì)用在函數(shù)內(nèi)容非常簡(jiǎn)單的時(shí)候,這是因?yàn)椋瑑?nèi)聯(lián)函數(shù)的代碼會(huì)在任何調(diào)用它的地方展開(kāi),如果函數(shù)太復(fù)雜,代碼膨脹帶來(lái)的惡果很可能會(huì)大于效率的提高帶來(lái)的益處。
你好!!!
拷貝的時(shí)候直接調(diào)用的庫(kù)函數(shù)的,放然可以使用其他的方法:
#include
stdio.h
#include
malloc.h
#includestring.h
inline
void
fun(char*a,char
*b
)
{
strcpy(b,a);
}
void
main()
{
char
*a=(char*)malloc(sizeof(char)*20)
;//開(kāi)辟空間
char
*b=(char*)malloc(sizeof(char)*20)
;
printf("輸入字符串(長(zhǎng)度小于20)\n");
scanf("%s",a);
printf("字符串a(chǎn):%s\n",a);
fun(a,b);
printf("字符串b:%s\n",b);
}
測(cè)試:
輸入字符串(長(zhǎng)度小于20)
hello
字符串a(chǎn):hello
字符串b:hello
Press
any
key
to
continue
c++從c中繼承的一個(gè)重要特征就是效率。假如c++的效率明顯低于c的效率,那么就會(huì)有很大的一批程序員不去使用c++了。
在c中我們經(jīng)常把一些短并且執(zhí)行頻繁的計(jì)算寫(xiě)成宏,而不是函數(shù),這樣做的理由是為了執(zhí)行效率,宏可以避免函數(shù)調(diào)用的開(kāi)銷(xiāo),這些都有預(yù)處理來(lái)完成。
但是在c++出現(xiàn)之后,使用預(yù)處理宏會(huì)出現(xiàn)兩個(gè)問(wèn)題:
為了保持預(yù)處理宏的效率又增加安全性,而且還能像一般成員函數(shù)那樣可以在類(lèi)里訪(fǎng)問(wèn)自如,c++引入了內(nèi)聯(lián)函數(shù)(inline function).
內(nèi)聯(lián)函數(shù)為了繼承宏函數(shù)的效率,沒(méi)有函數(shù)調(diào)用時(shí)開(kāi)銷(xiāo),然后又可以像普通函數(shù)那樣,可以進(jìn)行參數(shù),返回值類(lèi)型的安全檢查,又可以作為成員函數(shù)。
預(yù)處理器宏存在問(wèn)題的關(guān)鍵是我們可能認(rèn)為預(yù)處理器的行為和編譯器的行為是一樣的。當(dāng)然也是由于宏函數(shù)調(diào)用和函數(shù)調(diào)用在外表看起來(lái)是一樣的,因?yàn)橐踩菀妆换煜5瞧渲幸矔?huì)有一些微妙的問(wèn)題出現(xiàn):
問(wèn)題1
問(wèn)題2:
問(wèn)題3:
預(yù)定義宏函數(shù)沒(méi)有作用域概念,無(wú)法作為一個(gè)類(lèi)的成員函數(shù),也就是說(shuō)預(yù)定義宏沒(méi)有辦法表示類(lèi)的范圍。
在c++中,預(yù)定義宏的概念是用內(nèi)聯(lián)函數(shù)來(lái)實(shí)現(xiàn)的,而內(nèi)聯(lián)函數(shù)本身也是一個(gè)真正的函數(shù)。內(nèi)聯(lián)函數(shù)具有普通函數(shù)的所有行為。唯一不同之處在于內(nèi)聯(lián)函數(shù)會(huì)在適當(dāng)?shù)牡胤较耦A(yù)定義宏一樣展開(kāi),所以不需要函數(shù)調(diào)用的開(kāi)銷(xiāo)。因此應(yīng)該不使用宏,使用內(nèi)聯(lián)函數(shù)。
內(nèi)聯(lián)函數(shù)的確占用空間,但是內(nèi)聯(lián)函數(shù)相對(duì)于普通函數(shù)的優(yōu)勢(shì)只是省去了函數(shù)調(diào)用時(shí)候的壓棧,跳轉(zhuǎn),返回的開(kāi)銷(xiāo)。我們可以理解為內(nèi)聯(lián)函數(shù)是以 空間換時(shí)間 。
為了定義內(nèi)聯(lián)函數(shù),通常必須在函數(shù)定義前面放一個(gè)inline關(guān)鍵字。但是在類(lèi)內(nèi)部定義內(nèi)聯(lián)函數(shù)時(shí)并不是必須的。任何在類(lèi)內(nèi)部定義的函數(shù)自動(dòng)成為內(nèi)聯(lián)函數(shù)。
構(gòu)造函數(shù)Person,成員函數(shù)PrintPerson在類(lèi)的內(nèi)部定義,自動(dòng)成為內(nèi)聯(lián)函數(shù),當(dāng)然也并不是所有的函數(shù)都是內(nèi)聯(lián)函數(shù),因?yàn)榫幾g器會(huì)根據(jù)函數(shù)的復(fù)雜度來(lái)決定是否要把函數(shù)當(dāng)作內(nèi)聯(lián)函數(shù)。
內(nèi)聯(lián)函數(shù)并不是何時(shí)何地都有效,為了理解內(nèi)聯(lián)函數(shù)何時(shí)有效,應(yīng)該要知道編譯器碰到內(nèi)聯(lián)函數(shù)會(huì)怎么處理?
對(duì)于任何類(lèi)型的函數(shù),編譯器會(huì)將函數(shù)類(lèi)型(包括函數(shù)名字,參數(shù)類(lèi)型,返回值類(lèi)型)放入到符號(hào)表中。同樣,當(dāng)編譯器看到內(nèi)聯(lián)函數(shù),并且對(duì)內(nèi)聯(lián)函數(shù)體進(jìn)行分析沒(méi)有發(fā)現(xiàn)錯(cuò)誤時(shí),也會(huì)將內(nèi)聯(lián)函數(shù)放入符號(hào)表。
當(dāng)調(diào)用一個(gè)內(nèi)聯(lián)函數(shù)的時(shí)候,編譯器首先確保傳入?yún)?shù)類(lèi)型是正確匹配的,或者如果類(lèi)型不正完全匹配,但是可以將其轉(zhuǎn)換為正確類(lèi)型,并且返回值在目標(biāo)表達(dá)式里匹配正確類(lèi)型,或者可以轉(zhuǎn)換為目標(biāo)類(lèi)型,內(nèi)聯(lián)函數(shù)就會(huì)直接替換函數(shù)調(diào)用,這就消除了函數(shù)調(diào)用的開(kāi)銷(xiāo)。假如內(nèi)聯(lián)函數(shù)是成員函數(shù),對(duì)象this指針也會(huì)被放入合適位置。
類(lèi)型檢查和類(lèi)型轉(zhuǎn)換、包括在合適位置放入對(duì)象this指針這些都是預(yù)處理器不能完成的(不能通過(guò)宏來(lái)實(shí)現(xiàn))。
但是c++內(nèi)聯(lián)編譯會(huì)有一些限制,以下情況編譯器可能考慮不會(huì)將函數(shù)進(jìn)行內(nèi)聯(lián)編譯:
內(nèi)聯(lián)僅僅只是給編譯器一個(gè)建議,編譯器不一定會(huì)接受這種建議,如果你沒(méi)有將函數(shù)聲明為內(nèi)聯(lián)函數(shù),那么編譯器也可能將此函數(shù)做內(nèi)聯(lián)編譯。一個(gè)好的編譯器將會(huì)內(nèi)聯(lián)小的、簡(jiǎn)單的函數(shù)。
分享文章:c語(yǔ)言?xún)?nèi)聯(lián)函數(shù)指針 c語(yǔ)言 內(nèi)聯(lián)
新聞來(lái)源:http://vcdvsql.cn/article20/dopieco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、搜索引擎優(yōu)化、服務(wù)器托管、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)