這篇文章主要為大家展示了C/C++中指針和數(shù)組有什么不同,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來看看吧。
公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出建鄴免費(fèi)做網(wǎng)站回饋大家。
這邊先簡(jiǎn)單介紹一下內(nèi)存分區(qū)。
內(nèi)存按照用途劃分為五個(gè)區(qū):
1.棧區(qū):由系統(tǒng)控制分配和回收。
例如定義變量 int x = 0; int *p = NULL;
變量所占的內(nèi)存都是分配在棧區(qū)的。
2.堆區(qū):由程序員管理。
在C語(yǔ)言中由 malloc 申請(qǐng)的內(nèi)存,或者在C++中,用 new 申請(qǐng)的內(nèi)存,是在堆區(qū)中申請(qǐng)的。用完之后需要程序員自己回收,否則會(huì)造成內(nèi)存泄漏。
3.全局區(qū):存儲(chǔ)全局變量及靜態(tài)變量
4.常量區(qū):存儲(chǔ)常量。
5.代碼區(qū):存儲(chǔ)編譯之后的二進(jìn)制代碼。
數(shù)組和指針具有很大的相似性,實(shí)際上,數(shù)組也是一種指針,一種有點(diǎn)特別的指針。
例如,可以這樣申請(qǐng)包含10個(gè) int 型數(shù)據(jù)的數(shù)組
//方式1 int arr[10]; //棧區(qū) //方式2 int *ptr = new int[10]; //堆區(qū)
我們也常常在定義一個(gè)函數(shù)的時(shí)候使用指針,而傳入實(shí)參(argument)的時(shí)候使用數(shù)組(甚至函數(shù)的聲明和定義可以用指針和數(shù)組混搭)。例如:
void func(int *ptr, int n) { //statements } int main(void) { int arr[10]; ... func(arr, 10); return 0; }
數(shù)組名代表著一個(gè)地址,是其所占內(nèi)存單元的首地址。在上例中,arr 和 &arr[0] 是相同的。
數(shù)組名表示一個(gè)地址,這一點(diǎn)和指針一樣。不一樣的地方在于數(shù)組名是一個(gè)固定的地址,數(shù)組是存放在棧區(qū)的,其地址不能改變,也即是一個(gè) const 。
在用一個(gè)指針指向數(shù)組的時(shí)候,可以有幾種形式。
int arrInt[10]; /* ptr1 和 arrInt 的值是一樣的,都是同一塊內(nèi)存空間的首地址。 這種形式規(guī)定了 ptr1 指向了一個(gè)包含10個(gè)元素的整形數(shù)組,書寫麻煩,同時(shí)也限制了指針,因此很少用。 */ int (*ptr1)[10] = &arrInt; /* 這種形式就是我們比較熟悉和喜聞樂見的了。 在前面一塊代碼中,在實(shí)參中傳入數(shù)組名,實(shí)際上做了這樣一件事情: int *ptr = arrInt; 形式參數(shù)是一個(gè)指向了 arrInt 的指針。 重點(diǎn)要解釋的地方在下一塊代碼中說明~~~ */ int *ptr2 = arrInt;
在C++中,有一種引用類型,相當(dāng)于給變量取了個(gè)別名,在傳遞參數(shù)的時(shí)候就不會(huì)拷貝參數(shù),提高了效率,減少了內(nèi)存開銷。
顯而易見,在傳遞數(shù)組參數(shù)的時(shí)候,可以使用數(shù)組的引用。
數(shù)組的引用也有不同的方式:
int arrInt[10]; //和指向數(shù)組的指針的第一種定義方式類似 int (&ref1)[10] = arrInt; //這樣寫怎么樣? int *&ref2 = arrInt; /* 編譯器會(huì)報(bào)錯(cuò): invalid initialization of non-const reference of type 'int*&' from an rvalue of type 'int*'. 原因在于,在棧區(qū)中的數(shù)組 arrInt 由系統(tǒng)控制,它的地址不能改變。 如果上面的代碼可以通過,就意味著可以通過 ref2 指向其他的地址,從而修改 arrInt 的內(nèi)存地址,這是不允許的,所以編譯不通過。 */ /* 可以這樣做。 ref3 是一個(gè)引用,并且是一個(gè)常量的引用,引用的是一個(gè) int* 。 由于 ref3 是一個(gè)常量引用,它的值不允許被修改,因此 ref3 就能夠引用 arrInt。 */ int * const &ref3 = arrInt;
啰啰嗦嗦講了這么多,其實(shí)就一句話——
在棧區(qū)中的數(shù)組是一種不能改變地址的指針,或者說是一種 const 指針。
o(╯╰)o
(再多一句~~~)
而在堆區(qū)中動(dòng)態(tài)申請(qǐng)內(nèi)存的數(shù)組,也就是我們平時(shí)在用的指針。
以上就是關(guān)于C/C++中指針和數(shù)組有什么不同的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。
文章標(biāo)題:C/C++中指針和數(shù)組有什么不同
轉(zhuǎn)載注明:http://muchs.cn/article18/pioegp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、企業(yè)建站、軟件開發(fā)、網(wǎng)站內(nèi)鏈、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)