91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C/C++中指針和數組有什么不同

發布時間:2020-07-20 16:38:29 來源:億速云 閱讀:160 作者:小豬 欄目:編程語言

這篇文章主要為大家展示了C/C++中指針和數組有什么不同,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

這邊先簡單介紹一下內存分區。

內存按照用途劃分為五個區:

1.棧區:由系統控制分配和回收。

例如定義變量 int x = 0; int *p = NULL; 變量所占的內存都是分配在棧區的。

2.堆區:由程序員管理。

在C語言中由 malloc 申請的內存,或者在C++中,用 new 申請的內存,是在堆區中申請的。用完之后需要程序員自己回收,否則會造成內存泄漏。

3.全局區:存儲全局變量及靜態變量

4.常量區:存儲常量。

5.代碼區:存儲編譯之后的二進制代碼。

數組和指針具有很大的相似性,實際上,數組也是一種指針,一種有點特別的指針。
例如,可以這樣申請包含10個 int 型數據的數組

//方式1
int arr[10]; //棧區
//方式2
int *ptr = new int[10]; //堆區

我們也常常在定義一個函數的時候使用指針,而傳入實參(argument)的時候使用數組(甚至函數的聲明和定義可以用指針和數組混搭)。例如:

void func(int *ptr, int n) {
 //statements
}

int main(void) {
 int arr[10];
 ...
 func(arr, 10);
 return 0;
}

數組名代表著一個地址,是其所占內存單元的首地址。在上例中,arr 和 &arr[0] 是相同的。

數組名表示一個地址,這一點和指針一樣。不一樣的地方在于數組名是一個固定的地址,數組是存放在棧區的,其地址不能改變,也即是一個 const 。
在用一個指針指向數組的時候,可以有幾種形式。

int arrInt[10];
/*
ptr1 和 arrInt 的值是一樣的,都是同一塊內存空間的首地址。
這種形式規定了 ptr1 指向了一個包含10個元素的整形數組,書寫麻煩,同時也限制了指針,因此很少用。
*/
int (*ptr1)[10] = &arrInt;
/*
這種形式就是我們比較熟悉和喜聞樂見的了。
在前面一塊代碼中,在實參中傳入數組名,實際上做了這樣一件事情:
int *ptr = arrInt; 形式參數是一個指向了 arrInt 的指針。
重點要解釋的地方在下一塊代碼中說明~~~
*/
int *ptr2 = arrInt;

在C++中,有一種引用類型,相當于給變量取了個別名,在傳遞參數的時候就不會拷貝參數,提高了效率,減少了內存開銷。
顯而易見,在傳遞數組參數的時候,可以使用數組的引用。
數組的引用也有不同的方式:

int arrInt[10];
//和指向數組的指針的第一種定義方式類似
int (&ref1)[10] = arrInt;
//這樣寫怎么樣?
int *&ref2 = arrInt;
/*
編譯器會報錯:
invalid initialization of non-const reference of type 'int*&' from an rvalue of type 'int*'.
原因在于,在棧區中的數組 arrInt 由系統控制,它的地址不能改變。
如果上面的代碼可以通過,就意味著可以通過 ref2 指向其他的地址,從而修改 arrInt 的內存地址,這是不允許的,所以編譯不通過。
*/
/*
可以這樣做。
ref3 是一個引用,并且是一個常量的引用,引用的是一個 int* 。
由于 ref3 是一個常量引用,它的值不允許被修改,因此 ref3 就能夠引用 arrInt。
*/
int * const &ref3 = arrInt;

啰啰嗦嗦講了這么多,其實就一句話——
在棧區中的數組是一種不能改變地址的指針,或者說是一種 const 指針。
o(╯╰)o
(再多一句~~~)
而在堆區中動態申請內存的數組,也就是我們平時在用的指針。

以上就是關于C/C++中指針和數組有什么不同的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c c+
AI

金乡县| 湄潭县| 木兰县| 华亭县| 灌南县| 定西市| 怀集县| 昌乐县| 赞皇县| 福贡县| 泰安市| 贺兰县| 汉源县| 云和县| 京山县| 庄浪县| 金秀| 抚宁县| 招远市| 嘉黎县| 读书| 类乌齐县| 泾源县| 镇巴县| 兴宁市| 湛江市| 冷水江市| 通山县| 昆山市| 景谷| 新泰市| 东港市| 重庆市| 铁力市| 盘山县| 宁强县| 沈阳市| 佛冈县| 永登县| 萍乡市| 保亭|