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