国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++入門(3)——使用new分配內存

2019-11-06 06:29:17
字體:
來源:轉載
供稿:網友

指針和數字

指針不是整型,雖然計算機通常把地址當作整數處理。指針描述的是位置,對兩個地址相乘并沒有意義。因此,不能簡單地將整數賦給指針

使用new來分配內存

對指針有一定了解之后,我們來看看它如何實現在程序運行時分配內存。前面我們將指針初始為變量地址只是為了描述指針的作用,而變量是在編譯時分配的有名稱的內存。指針真正的用處在于,在運行階段分配未命名的內存來儲存值。在C語言中,可以使用庫函數malloc() 來分配內存,在C++中仍然可以這么做,但有更好的方法new

int *a = new int;

new int告訴程序,需要適合存儲int的內存。new運算符根據類型來確定需要多少字節的內存。然后它找到這樣的內存,并返回其地址,將地址賦給a,a是被聲明指向int的指針,現在*a是存儲在那里的值。我們來看一下具體應用

#include <iostream> int main() { using namespace std; int nights = 1001; int * pt = new int; // allocate space for an int *pt = 1001; // store a value there cout << "nights value = "; cout << nights << ":location = " << &nights << endl; cout << "int values = " << *pt << ": location = " << pt << endl; double * pd = new double; // allocate space for a double *pd = 100001.0; // store a double there cout << "double value = " << *pd << ":location = " << pd << endl; cout << "location of pointer pd: " << &pd << endl; cout << "size of pt = " << sizeof(pt); cout << ":size of *pt = " << sizeof(*pt) << endl; cout << "size of pd = " << sizeof(pd); cout << "size of *pd = " << sizeof(*pd) << endl; return 0; }

結果如下

nights value = 1001:location = 0x7ffdd5606704 int values = 1001: location = 0x1034c20 double value = 100001:location = 0x1035050 location of pointer pd: 0x7ffdd5606708 size of pt = 8:size of *pt = 4 size of pd = 8size of *pd = 8

從中可以看到,雖然變量night 和指針*pt 指向的變量值相同,但一個是編譯時由系統分配的地址,另一個是我們通過 new 由系統分配的地址。而且我們發現,對于指針pd,我們還可以對它再求地址,就得到這個指針變量的地址。(可以理解為指針管理了一個變量的兩個方面——地址和值,而指針自己也有在內存中的存儲地址)

使用delete釋放內存

當需要內存時,可以使用new來請求,這只是C++內存管理數據包中有魅力的一方面。另一方面是delete 運算符在使用完內存后將其釋放給內存池(而不是其他語言的垃圾回收)

int *ps = new int; //allocate memory with new delete ps; // free memory with delete when done

這將釋放ps指向的內存,但不會刪除指針ps本身,例如可以將ps重新指向另一個新分配的內存塊。一定要配對地使用newdelete ,否則將發生內存泄漏(memory leak)。也就是說,被分配的內存再也無法使用了。

使用new來創建動態數組

如果程序只需要一個值,則可能會聲明一個簡單變量,但對于大型數據(如數組,字符串和結構),應使用new。假如一個程序,它是否需要數組取決于運行時用戶提供的信息。如果通過聲明來創建數組,則在程序被編譯時將為它分配內存空間。不管程序最終是否使用數組,數組都在那里,它浪費了內存。 下面來看一下使用new創建動態數組

int *arr = new int [10] // get a block of 10 ints delete [] arr; // 方括號代表釋放整個數組

new運算符返回第一個元素的地址,在這個例子中,該地址被賦給指針arr。那么如何訪問其中的元素呢?第一個元素不成問題,由于arr指向數組的第一個元素,還有9個元素,只需要把指針當作數組名使用就可以,arr[0] 是第一個元素,以此類推。(這里不需要*號)

#include <iostream> int main() { using namespace std; double *p3 = new double[3]; p3[0] = 0.2; // space for 3 doubles p3[1] = 0.5; // treat p3 like an Array name p3[2] = 0.8; cout << "p3[1] is " << p3[1] << "./n"; p3 = p3 + 1; cout << "Now p3[0] is " << p3[0] << " and "; cout << "p3[1] is " << p3[1] << "./n"; p3 = p3 - 1; // point back to beginning delete []p3; // free the memory return 0; }

我們看一下輸出

p3[1] is 0.5. Now p3[0] is 0.5 and p3[1] is 0.8.

從中可以知道,指針p3 被當作數組名來使用,p3[0] 為第一個元素,依次類推。將p3加1導致它指向第二個元素而不是第一個,將它減1之后,指針指向原來的值,這樣程序便可以給delete[]提供正確的地址。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 郁南县| 西城区| 山西省| 辽宁省| 乌恰县| 九寨沟县| 岑溪市| 泸水县| 沂南县| 大石桥市| 迭部县| 永吉县| 濮阳市| 五家渠市| 托里县| 昌图县| 宜兰县| 林口县| 扎囊县| 安塞县| 凤庆县| 平湖市| 安庆市| 顺平县| 哈尔滨市| 安达市| 应城市| 杭锦旗| 英山县| 花莲县| 大丰市| 井陉县| 东乡县| 柳州市| 三门县| 开阳县| 榆中县| 耒阳市| 英德市| 麻城市| 陵川县|