您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++中指針和內存分配分別是什么”,在日常操作中,相信很多人在C++中指針和內存分配分別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++中指針和內存分配分別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
指針是保存內存位置地址的變量。我們知道聲明的所有變量在內存中都有一個特定的地址。聲明一個指針變量來指向內存中的這些地址。
聲明指針變量的一般語法是:
int p, *ptr; //聲明變量p和指針變量ptr p = 4; //賦值4給變量p ptr = &p; //將p的地址分配給指針變量ptr
在內存中,這些聲明將表示如下:
這是指針在內存中的內部表示。當地址變量分配給指針變量時,它指向的變量如上圖所示。
由于 ptr
具有變量 p 的地址,*ptr
將給出變量 p 的值(指針變量 ptr 指向的變量)。
為什么需要 C++ 中的指針?為了解釋對指針的需要,有必要回到基本內存布局。
每當執行程序時,程序指令都會駐留在代碼段中。并且所有的方法和數據都將駐留在堆棧中。代碼部分只能訪問堆棧部分,但不能直接訪問堆部分。
注意:由于代碼段不能直接訪問堆段,所以不能直接使用堆內存,會被浪費掉,造成棧內存溢出。
使用指針可以解決這個問題。指針為代碼部分提供了對堆內存的間接訪問
在堆棧部分創建一個指針,該指針指向堆部分的內存地址,從而間接訪問堆部分。
在堆部分分配內存發生在運行時,而不是在編譯時,因此分配堆內存稱為動態內存分配。
一般來說,C++不會在堆中分配一個內存,因為在使用指針時通常會遇到的復雜性。所以只分配一個內存塊,我們就要使用堆內存,比如對于數組,我們會進行動態內存分配。
在 C++ 中,new
運算符用于在運行時分配內存,內存以字節為單位分配。該新操作符表示用于在堆動態存儲器分配的請求。如果有足夠的內存可用,則new運算符初始化內存并將新分配和初始化的內存的地址返回給指針變量。
語法:
datatype *pointer_name = new datatype
具體例子
int *ptr = new int;//在動態分配時,我們可以通過以下兩種方式聲明一個變量。 int *ptr = new int (10); int *ptr = new int {15}; // new運算符還用于分配數據類型的內存塊(數組)。 int *ptr = new int[20]; // 上面的語句為int類型的20個整數連續動態分配內存,并返回指向序列的第一個元素指向“ptr”指針。
一旦使用new關鍵字將堆內存分配給變量或類對象,我們就可以使用delete關鍵字釋放該內存空間。
動態內存分配概念的主要用途是通過指定其大小來聲明數組,但不確定它時將內存分配給數組。
看一個例子來理解數組的內存分配用法。
#include <iostream> using namespace std; int main() { int len, sum = 0; cout << "Enter the no. of students in the class" << endl; cin >> len; int *marks = new int[len]; //Dynamic memory allocation cout << "Enter the marks of each student" << endl; for (int i = 0; i < len; i++) { cin >> *(marks + i); } for (int i = 0; i < len; i++) { sum += *(marks + i); } cout << "sum is " << sum << endl; return 0; }
在代碼中,首先詢問用戶一個班級的學生人數,并將其值存儲在 len 變量中。
然后聲明一個整數數組,并使用此語句在內存中動態分配等于 len 變量中存儲的值的空間 int *marks = new int[length];
因此它被分配了一個等于“長度*(1個整數的大小)”的空間。
到此,關于“C++中指針和內存分配分別是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。