-
1 # 默默77553073
-
2 # 和不同
使用指標是為了實現對計算機系統的全面控制。
我們從計算機的結構簡單說說吧。
當前的主流計算機均採用馮諾伊曼體系結構。後面均假設使用此體系結構的計算機。
(部分處理器自稱為哈佛結構,但也僅限於CPU核心及Cache內部,就整個系統而言仍是馮諾伊曼結構)
在此結構下,幾乎所有的計算機系統資源都可被定址訪問(除了CPU內部暫存器)。
常見的資源,如:
高速記憶體(片內SRAM)
普通記憶體(片外DRAM,如DDR4)
高速片內裝置暫存器:如中斷控制器、DMA控制器
低速外設暫存器:如序列控制器
要實現對這些資源的控制,必須能精確控制讀寫操作的地址、次數、位寬。
再比如,中斷處理程式,需要精確瞭解程式碼所在地址,這在C語言中可透過函式指標獲得。
總體說來,透過指標,能達到對目的碼、資料空間的精確控制,基本能完整的控制計算機的各種資源(CPU內部資源往往需特殊彙編指令控制)。
個人看法:C語言透過放棄對暫存器的精確控制,實現了程式設計和學習的簡化;又透過指標高效的抽象了計算機資源的訪問方式,達成了細節和複雜度的優秀平衡,這也是C語言經久不衰的一大法寶。
-
3 # 日衝資訊 黃
指標主要有兩個用途,其中一個用途被廣泛應用到其他語言。
指標是如何管理記憶體的指標的一個用途是管理連續的記憶體。字串是最常用的連續資料,通常我們可以用陣列來儲存字串。但這麼做有個弊端,這就是必須按照字串的最大長度申請棧的空間。請忽略棧的原理,只要知道棧的空間會被佔用較長時間,要等到函式執行完畢,甚至是程式執行完畢才會被釋放。對於一臺PC而言這點記憶體是小事一樁,但對於記憶體有限的嵌入式系統來說,這麼做就有些奢侈了。所以,我們先定義一個指標,用malloc按照實際的長度申請堆的空間。堆的空間可以隨時釋放,這樣記憶體的使用效率就比較高了。
用指標傳遞複雜引數指標還可以傳遞一些複雜的引數,比如,陣列,結構體甚至是函式。其他語言中,也有指標傳遞的概念,它被稱作地址傳遞或者引用傳遞。在C#中,用ByRef關鍵字定義指標,而用ByVal關鍵字定義值。而Java則刻意隱藏了指標的概念。但下面這個例子中還是漏出了馬腳:
String str=“Hello”;String ptr=new String(“Hello”);第一行中的變數是值,用它傳參相當於複製了自己也就是值傳遞。而第二行的引數是一個指標,用它傳參雖然也會複製自己,但是由於它是字串的首地址,相當於引用傳遞。
回覆列表
C語言屬於底層語言,當然要抄作記憶體了。
可以說,不會指標就別說自己會用C語言了。
用不好指標,程式就飛了