ptt神人:如果你是好好讀書從基礎學起,我不清楚陣列跟指標到底有什麼難懂

陳國仁
3 min readFeb 11, 2020

--

找程式文章,看到一位ptt神人寫的神文,針對什麼是:

識別字、宣告、變數、運算元、運算子、運算式、敘述、複合敘述、型別等,

幾句話由淺入深講得很清楚!!

https://www.ptt.cc/bbs/Soft_Job/M.1530045810.A.BE1.html

Re: [請益] C++觀念參考書選擇
.
.
.

說真的如果你是好好讀書從基礎學起,我不清楚陣列跟指標到底有什麼難懂。

陣列名稱跟指標名稱都是識別字 (identifier),使用前需要先宣告 (declare)。這些識別字在被定義 (define) 後會在記憶體被配置一塊空間,裡面可以存資料。

當這些識別字被拿來當變數 (variable) 使用時,同時也會是運算元 (operand)。而針對運算元進行操作的符號稱為運算子 (operator),功能當然就是拿運算元來運算。由運算元和運算子構成運算式 (expression),譬如 a + b 這樣的東西。

由一條運算式再加上分號做結尾,就構成一條簡單敘述 (simple statement)。而使用大括號把好幾條敘述包起來的就叫複合敘述 (compound statement)。敘述 (statement) 在 C/C++ 是真正的基本單位,整個程式由各種敘述完成。一般人講的什麼 if 語法、switch 語法等等,真正的名稱是叫 if 敘述、switch 敘述。

講這些幹嘛?因為程式語言也是語言,只是限制比較多,學起來比自然語言簡單而已。你學英文一樣要學文法,要知道如名詞、動詞、形容詞、副詞等各種詞性。運算式在英文的文法裡如同子句 (clause) 或片語 (phrase),而敘述在英文的當中就是更淺顯易懂的東西,稱為句子 (sentence)。就如同文章是由段落組成,段落是由句子組成一樣,你的整個程式也是由一段一段的敘述所組合出來的。

當然就像一本著作甚至還會區分章節一樣,程式其實也有編譯單元、模組等概念。不過這種東西對你現階段來說還太早,因為你寫程式的主要方法還是拿現成的來改。你要先學的東西,就只是怎麼在一張完全空白的白紙上寫出無語法錯誤的一支支小程式。

陣列名稱說穿了丟到程式上就是個運算元及變數,然後它有特殊的運算子可以對它操作,也就是下標運算子 (subscript operator),就是中括號 [] 這種東西。

指標名稱說穿了丟到程式上還是個運算元和變數,它也有個特殊的運算子可以對它操作,稱為提領運算子 (dereference operator),也就是星號 * 這種東西。這東西你只要稍微瞭解一下是在幹嘛,就算看到 N 個提領運算子在一起,也不會怕它。N 個提領運算子在一起就是做 N 次提領而已,也沒什麼,本質都是不變的。

除此之外,運算子作用在不同型別的運算元上也有不同意義,譬如你對一個指標型別的運算元做 + 1,實際上運算結果常常不是只是多了 1 而已。你必須先搞清楚不同型別 (type) 的運算元有哪些運算子可以用,它們的作用是什麼。

什麼叫型別?陣列和指標本身就是一種型別,當然你常看到的 int、float 等等也是。型別影響到編譯器怎麼去看待運算子跟運算元,轉譯出來的機械指令也有差別。兩個 double 變數相加,編譯器轉譯出來的是浮點運算指令,因此這種加法的兩個運算元裡的位元排列方式,CPU 會以浮點數特有的格式來做解讀。兩個 int 變數相加,編譯器轉譯出來的是整數運算指令,因此這種加法的兩個運算元裡的位元排列方式,CPU 會以整數格式來做解讀。當運算子兩邊的運算元型別不同時,編譯器還得先暗中把它們轉成同型別再決定指令。

--

--