1. 程式人生 > >關於C++指針

關於C++指針

導致 活性 很多 語言 不能 由於 理解 靜態 delete

C++繼承於C,對C的語法做了一些擴展。C語言中的指針占一個機器長度(32位處理器上一個指針占32位,64位處理器上安裝64位操作系統一個指針占64位),指針的作用就是使用這塊內存(4字節或者8字節)去記錄另外一塊內存的起始位置。原理很簡單,但是使用起來功能強大,有時還會使人疑惑(搞不清楚的程序員經常造成程序內存訪問越界、內存泄漏等等嚴重的問題)。

C語言中,大概可以把指針分為兩種,數據指針和函數指針。數據一般以變量的方式存在,放在堆空間或者棧空間裏面。數據指針可以記錄它的讀取位置。函數放在代碼段裏面,該段用來存放編譯完成的機器碼,是供CPU執行的指令集,只能讀不能修改,函數的入口就在該段內存中。指針可以記錄函數的入口地址。由於指針記錄了他們的起始地址,我們可以通過指針間接訪問函數和變量,而不必使用函數原名和變量名訪問,大大提高了程序的靈活性。

不同類型的指針都是用來記錄內存位置的,同一臺機器上指針所占內存空間都相同,所以它們可以強制轉換類型,而記錄的值不改變。但是訪問該位置時如果心裏不清楚該位置存放的是何種內容時,就會發生天災人禍。

C++繼承了C的指針。但是由於C++需要支持面向對象,指針的用法有了很多擴展,這時候,就連我都是一臉懵的。

C++中出現了引用,可以給一個變量取多個變量名,這個語法可以取代指針。但是它與指針並存。

C++中出現了類的封裝。所以出現了關於類成員的指針。類裏面有成員函數和成員變量,又分為靜態和非靜態。是不是有點怕怕的了。

對於類的靜態成員,它其實與和普通的全局變量和全局函數一樣,唯一的不同就是作用域變成了該類。所以只需要在它前面加個作用域就可以了。指向它們(記錄它們位置)的指針和C指針的用法一樣。

對於非靜態數據成員,它就像C語言的結構體的成員一樣,也不用緊張,用法和C的結構體成員一樣。

對於非靜態函數成員,C++編譯器在底層做了一點點修改,就是把它的第一個參數設置為它所屬的類的對象的指針,其他參數往後移一個位置。在使用該類對象調用這個成員函數時,偷偷傳入了該對象的地址,該函數才能通過這個指針訪問到這個對象的非靜態數據成員。其他都和類的靜態函數一樣。在使用指向這樣的函數的指針調用成員函數時,需要註意的就是多加一個類作用域,多加一個首參數(該類實例對象的首地址)。

作出了這些擴展之後,C++的指針變得稍微有一點復雜。導致很多程序員稍不註意就不會使用指針了。於是C++標準庫中提供了多種語義的智能指針。它們跟語法沒關系,而是在既定的語法上面定義了幾種類,用來代替原生的指針。使用這些智能指針指向堆內存後,我們不在需要手動delete堆內存,智能指針在析構它們自身時會幫忙把堆內存釋放避免內存泄漏。

原生指針,類成員指針,引用,標準庫智能指針等等,都叫指針,因為它們的作用都是 間接訪問內存中的某個位置。理解了這一點再去看清楚上述的細節。就會明了很多。

另外我自己做了一些技術收藏,都是關於C++和服務器開發,操作系統等技術的。有興趣可以看一下,瀏覽器直接訪問IP地址119.29.4.18

關於C++指針