指針不是整型,雖然計算機通常把地址當作整數(shù)處理。指針描述的是位置,對兩個地址相乘并沒有意義。因此,不能簡單地將整數(shù)賦給指針
對指針有一定了解之后,我們來看看它如何實現(xiàn)在程序運行時分配內(nèi)存。前面我們將指針初始為變量地址只是為了描述指針的作用,而變量是在編譯時分配的有名稱的內(nèi)存。指針真正的用處在于,在運行階段分配未命名的內(nèi)存來儲存值。在C語言中,可以使用庫函數(shù)malloc() 來分配內(nèi)存,在C++中仍然可以這么做,但有更好的方法new
new int告訴程序,需要適合存儲int的內(nèi)存。new運算符根據(jù)類型來確定需要多少字節(jié)的內(nèi)存。然后它找到這樣的內(nèi)存,并返回其地址,將地址賦給a,a是被聲明指向int的指針,現(xiàn)在*a是存儲在那里的值。我們來看一下具體應(yīng)用
結(jié)果如下
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 指向的變量值相同,但一個是編譯時由系統(tǒng)分配的地址,另一個是我們通過 new 由系統(tǒng)分配的地址。而且我們發(fā)現(xiàn),對于指針pd,我們還可以對它再求地址,就得到這個指針變量的地址。(可以理解為指針管理了一個變量的兩個方面——地址和值,而指針自己也有在內(nèi)存中的存儲地址)
當需要內(nèi)存時,可以使用new來請求,這只是C++內(nèi)存管理數(shù)據(jù)包中有魅力的一方面。另一方面是delete 運算符在使用完內(nèi)存后將其釋放給內(nèi)存池(而不是其他語言的垃圾回收)
這將釋放ps指向的內(nèi)存,但不會刪除指針ps本身,例如可以將ps重新指向另一個新分配的內(nèi)存塊。一定要配對地使用new 和 delete ,否則將發(fā)生內(nèi)存泄漏(memory leak)。也就是說,被分配的內(nèi)存再也無法使用了。
如果程序只需要一個值,則可能會聲明一個簡單變量,但對于大型數(shù)據(jù)(如數(shù)組,字符串和結(jié)構(gòu)),應(yīng)使用new。假如一個程序,它是否需要數(shù)組取決于運行時用戶提供的信息。如果通過聲明來創(chuàng)建數(shù)組,則在程序被編譯時將為它分配內(nèi)存空間。不管程序最終是否使用數(shù)組,數(shù)組都在那里,它浪費了內(nèi)存。 下面來看一下使用new創(chuàng)建動態(tài)數(shù)組
int *arr = new int [10] // get a block of 10 ints delete [] arr; // 方括號代表釋放整個數(shù)組new運算符返回第一個元素的地址,在這個例子中,該地址被賦給指針arr。那么如何訪問其中的元素呢?第一個元素不成問題,由于arr指向數(shù)組的第一個元素,還有9個元素,只需要把指針當作數(shù)組名使用就可以,arr[0] 是第一個元素,以此類推。(這里不需要*號)
我們看一下輸出
p3[1] is 0.5. Now p3[0] is 0.5 and p3[1] is 0.8.從中可以知道,指針p3 被當作數(shù)組名來使用,p3[0] 為第一個元素,依次類推。將p3加1導(dǎo)致它指向第二個元素而不是第一個,將它減1之后,指針指向原來的值,這樣程序便可以給delete[]提供正確的地址。
新聞熱點
疑難解答
圖片精選