一文讀懂C++中指針和內(nèi)存分配
指針
指針是保存內(nèi)存位置地址的變量。我們知道聲明的所有變量在內(nèi)存中都有一個(gè)特定的地址。聲明一個(gè)指針變量來指向內(nèi)存中的這些地址。
聲明指針變量的一般語法是:
int p, *ptr; //聲明變量p和指針變量ptr p = 4; //賦值4給變量p ptr = &p; //將p的地址分配給指針變量ptr
在內(nèi)存中,這些聲明將表示如下:

這是指針在內(nèi)存中的內(nèi)部表示。當(dāng)?shù)刂纷兞糠峙浣o指針變量時(shí),它指向的變量如上圖所示。
由于 ptr具有變量 p 的地址,*ptr 將給出變量 p 的值(指針變量 ptr 指向的變量)。
為什么需要 C++ 中的指針?為了解釋對指針的需要,有必要回到基本內(nèi)存布局。

每當(dāng)執(zhí)行程序時(shí),程序指令都會(huì)駐留在代碼段中。并且所有的方法和數(shù)據(jù)都將駐留在堆棧中。代碼部分只能訪問堆棧部分,但不能直接訪問堆部分。

注意:由于代碼段不能直接訪問堆段,所以不能直接使用堆內(nèi)存,會(huì)被浪費(fèi)掉,造成棧內(nèi)存溢出。
使用指針可以解決這個(gè)問題。指針為代碼部分提供了對堆內(nèi)存的間接訪問
在堆棧部分創(chuàng)建一個(gè)指針,該指針指向堆部分的內(nèi)存地址,從而間接訪問堆部分。

C++ 中使用指針的動(dòng)態(tài)內(nèi)存分配:
在堆部分分配內(nèi)存發(fā)生在運(yùn)行時(shí),而不是在編譯時(shí),因此分配堆內(nèi)存稱為動(dòng)態(tài)內(nèi)存分配。
一般來說,C++不會(huì)在堆中分配一個(gè)內(nèi)存,因?yàn)樵谑褂弥羔槙r(shí)通常會(huì)遇到的復(fù)雜性。所以只分配一個(gè)內(nèi)存塊,我們就要使用堆內(nèi)存,比如對于數(shù)組,我們會(huì)進(jìn)行動(dòng)態(tài)內(nèi)存分配。
在 C++ 中,new運(yùn)算符用于在運(yùn)行時(shí)分配內(nèi)存,內(nèi)存以字節(jié)為單位分配。該新操作符表示用于在堆動(dòng)態(tài)存儲器分配的請求。如果有足夠的內(nèi)存可用,則new運(yùn)算符初始化內(nèi)存并將新分配和初始化的內(nèi)存的地址返回給指針變量。
語法:
datatype *pointer_name = new datatype
具體例子
int *ptr = new int;//在動(dòng)態(tài)分配時(shí),我們可以通過以下兩種方式聲明一個(gè)變量。
int *ptr = new int (10);
int *ptr = new int {15};
// new運(yùn)算符還用于分配數(shù)據(jù)類型的內(nèi)存塊(數(shù)組)。
int *ptr = new int[20];
// 上面的語句為int類型的20個(gè)整數(shù)連續(xù)動(dòng)態(tài)分配內(nèi)存,并返回指向序列的第一個(gè)元素指向“ptr”指針。
一旦使用new關(guān)鍵字將堆內(nèi)存分配給變量或類對象,我們就可以使用delete關(guān)鍵字釋放該內(nèi)存空間。
動(dòng)態(tài)內(nèi)存分配概念的主要用途是通過指定其大小來聲明數(shù)組,但不確定它時(shí)將內(nèi)存分配給數(shù)組。
看一個(gè)例子來理解數(shù)組的內(nèi)存分配用法。
#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;
}
在代碼中,首先詢問用戶一個(gè)班級的學(xué)生人數(shù),并將其值存儲在 len 變量中。
然后聲明一個(gè)整數(shù)數(shù)組,并使用此語句在內(nèi)存中動(dòng)態(tài)分配等于 len 變量中存儲的值的空間 int *marks = new int[length];
因此它被分配了一個(gè)等于“長度*(1個(gè)整數(shù)的大?。钡目臻g。
以上就是C++中指針和內(nèi)存分配的詳細(xì)內(nèi)容,更多關(guān)于C++指針內(nèi)存分配的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Qt界面中滑動(dòng)條的實(shí)現(xiàn)方式
這篇文章主要介紹了Qt界面中滑動(dòng)條的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
基于C中一個(gè)行壓縮圖的簡單實(shí)現(xiàn)代碼
首先簡單說一下什么是行壓縮圖,其實(shí)嚴(yán)格意義上應(yīng)該是行壓縮矩陣2013-05-05
C語言進(jìn)程程序替換的實(shí)現(xiàn)詳解
為什么要進(jìn)程替換?因?yàn)楦高M(jìn)程創(chuàng)建出來的子進(jìn)程和父進(jìn)程擁有相同的代碼段,所以,子進(jìn)程看到的代碼和父進(jìn)程是一樣的。當(dāng)我們想要讓子進(jìn)程執(zhí)行不同的程序時(shí)候,就需要讓子進(jìn)程調(diào)用進(jìn)程程序替換的接口,從而讓子進(jìn)程執(zhí)行不一樣的代碼2022-08-08
Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤
這篇文章主要為大家詳細(xì)介紹了Qt編寫自定義控件實(shí)現(xiàn)抽獎(jiǎng)轉(zhuǎn)盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

