C Pointer Concepts in Java

學過 C 語言,轉換到 Java 語言時,常有如下困擾。 相較於 C 語言的變數分成 指標變數 (pointer variable) 和 非指標變數 (non-pointer variable),兩者可由型別前面是否有加 * 號作區隔。那麼, Java 語言沒有加 * 號的指標變數,若遇到須要指標的情境,例如鏈結清單 (linked list) 或 圖形結構(graph),該如何應對?

答案是 Java 語言有所謂參照變數 (reference variable) 的設計,以對應於 C 語言的指標變數。以下將舉例說明。

C 語言中只要變數宣告時,型別前面加 * 號就是指標變數,例如:


     int i = 3; // 宣告整數變數 i,記憶體切一塊整數空間,裏頭填入整數 3
     int *p; // 宣告整數指標變數 p,記憶體切一塊指標空間,裏頭值未定
     p = &i; // 將變數 i 住址填入變數 p 指標空間

其中,i 是一般 整數型別 (int) 變數,變數 i 存放的是記憶體空間中,某位址的整數,透過 i 可以存取該整數。 p 前面加 *, p 就變成 整數指標型別 (int *) 變數,變數 p 存放的是記憶體空間中,某塊可存放整數的住址,透過 p 可以存取該住址的整數。在第3行指令,p 接收 i 住址之後,兩者產生連動,*p 和 i 將看到相同內容,整數 3。

Java 語言則沒有明確的指標觀念,所有變數只分成基本型別 (primitive type) 及非基本型別 (non-primitive type)。基本型別限定8種,包含 boolean, char, byte, short, int, long, float, double。基本型別的保留字開頭皆小寫,用途和 C 語言類似,其變數可直接存取該變數值。

非基本型別又稱 參照型別 (reference type),包含所有 類別,介面,陣列,列舉等參照型別。參照型別的變數存放的是參照值,可想像成記憶體位置值,或物件索引值。例如:


     // 宣告整數參照變數 r,記憶體切一塊參照空間,裏頭填入 null
     Integer r; 
     
     // 建立存放整數 4 的整數物件,將其索引值填入變數 r 的參照空間
     r = new Integer(4);

其中, r 就是整數參照變數。變數 r 存放某整數物件的索引值之後,透過 r 可以存取該整數物件的整數 4。

沒有留言:

Building a Lightweight Streamlit Client for Local Ollama LLM Interaction

Ollama 提供端點串接服務,可由程式管理及使用本地大語言模型(LLM, Large Language Model)。 以下程式碼展示如何以 Streamlit 套件,建立一個輕量級的網頁介面,供呼叫 本地端安裝的 Ollama 大語言模型。 Ollama 預設的服務...

總網頁瀏覽量