欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談C/C++中指針和數(shù)組的不同

 更新時(shí)間:2020年05月29日 14:15:01   作者:Van0512  
本文主要解析了C/C++中數(shù)組和指針的區(qū)別,文章簡(jiǎn)單易懂,對(duì)各位的工作學(xué)習(xí)有所幫助,有需求的朋友可以了解下

這邊先簡(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ū)寫(xiě)麻煩,同時(shí)也限制了指針,因此很少用。
*/
int (*ptr1)[10] = &arrInt;
/*
這種形式就是我們比較熟悉和喜聞樂(lè)見(jiàn)的了。
在前面一塊代碼中,在實(shí)參中傳入數(shù)組名,實(shí)際上做了這樣一件事情:
int *ptr = arrInt; 形式參數(shù)是一個(gè)指向了 arrInt 的指針。
重點(diǎn)要解釋的地方在下一塊代碼中說(shuō)明~~~
*/
int *ptr2 = arrInt;

在C++中,有一種引用類型,相當(dāng)于給變量取了個(gè)別名,在傳遞參數(shù)的時(shí)候就不會(huì)拷貝參數(shù),提高了效率,減少了內(nèi)存開(kāi)銷。
顯而易見(jiàn),在傳遞數(shù)組參數(shù)的時(shí)候,可以使用數(shù)組的引用。
數(shù)組的引用也有不同的方式:

int arrInt[10];
//和指向數(shù)組的指針的第一種定義方式類似
int (&ref1)[10] = arrInt;
//這樣寫(xiě)怎么樣?
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)控制,它的地址不能改變。
如果上面的代碼可以通過(guò),就意味著可以通過(guò) ref2 指向其他的地址,從而修改 arrInt 的內(nèi)存地址,這是不允許的,所以編譯不通過(guò)。
*/
/*
可以這樣做。
ref3 是一個(gè)引用,并且是一個(gè)常量的引用,引用的是一個(gè) int* 。
由于 ref3 是一個(gè)常量引用,它的值不允許被修改,因此 ref3 就能夠引用 arrInt。
*/
int * const &ref3 = arrInt;

啰啰嗦嗦講了這么多,其實(shí)就一句話——
在棧區(qū)中的數(shù)組是一種不能改變地址的指針,或者說(shuō)是一種 const 指針。
o(╯╰)o
(再多一句~~~)
而在堆區(qū)中動(dòng)態(tài)申請(qǐng)內(nèi)存的數(shù)組,也就是我們平時(shí)在用的指針。

以上就是淺談C/C++中指針和數(shù)組的不同的詳細(xì)內(nèi)容,更多關(guān)于c/c++ 指針和數(shù)組的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解C++中特殊類設(shè)計(jì)

    詳解C++中特殊類設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++中關(guān)于特殊類設(shè)計(jì)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,感興趣的可以了解一下
    2023-07-07
  • Swift編程中的泛型解析

    Swift編程中的泛型解析

    這篇文章主要介紹了Swift編程中的泛型解析,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • 解析C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體

    解析C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體

    這篇文章主要介紹了C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • C語(yǔ)言中指針常量和常量指針的區(qū)別

    C語(yǔ)言中指針常量和常量指針的區(qū)別

    本文主要介紹了C語(yǔ)言中指針常量和常量指針的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易井字棋游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C語(yǔ)言開(kāi)發(fā)之歸并排序詳解及實(shí)例

    C語(yǔ)言開(kāi)發(fā)之歸并排序詳解及實(shí)例

    這篇文章主要介紹了 C語(yǔ)言開(kāi)發(fā)之歸并排序詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C語(yǔ)言詳細(xì)講解if語(yǔ)句與switch語(yǔ)句的用法

    C語(yǔ)言詳細(xì)講解if語(yǔ)句與switch語(yǔ)句的用法

    用 if 語(yǔ)句可以構(gòu)成分支結(jié)構(gòu),它根據(jù)給的條件進(jìn)行判定,以決定執(zhí)行哪個(gè)分支程序段,C 語(yǔ)言中還有另外一種分支語(yǔ)句,就是 switch 語(yǔ)句
    2022-05-05
  • C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析

    C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析

    這篇文章主要給大家介紹了關(guān)于C++中4種強(qiáng)制類型轉(zhuǎn)換區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C語(yǔ)言實(shí)現(xiàn)輸入兩個(gè)數(shù)字將其按從小到大輸出的方法

    C語(yǔ)言實(shí)現(xiàn)輸入兩個(gè)數(shù)字將其按從小到大輸出的方法

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)輸入兩個(gè)數(shù)字將其按從小到大輸出的方法,本文通過(guò)代碼講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C++分步實(shí)現(xiàn)職工管理系統(tǒng)詳解

    C++分步實(shí)現(xiàn)職工管理系統(tǒng)詳解

    這篇文章主要為大家詳細(xì)介紹了基于C++實(shí)現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-10-10

最新評(píng)論