C 語言返璞歸真 指標篇番外

2021-08-03 13:08:56 字數 1167 閱讀 9430

續 > 

c 語言返璞歸真: 指標篇(1)

在指標篇(1)當中, 提到了指標定義的兩種風格:「int *p 」和「int* p 」。 這篇博文就來說說為什麼會有兩種風格的指標定義。 

首先需要說明的是這兩種風格的指標定義在語法上完全正確, 任何的 c 語言編譯器都承認這兩種定義方式, 甚至你以寫成:「

int * p 

」, 但是這種寫法是完全不推薦的。  

既然編譯器不區分上述兩種風格的定義方法,那麼這兩種寫法究竟有什麼區別?我們知道 c 語言定義乙個變數是通過「資料型別 + 變數名」的方式。 譬如:「 int a 」,其中「 int 」是資料型別,「 a 」是變數名。 我們延伸到指標就明白了,「int *p 」將 「 int 」當成了資料型別, 「 *p 」則作為乙個整體被認為是指標變數。 即定義了乙個指標變數「 *p 」, 該指標的資料型別是「 int 」; 對於「

int* p 

」來說,「 int* 」作為乙個整體被認為是資料型別,而「 p 」則被認為是指標變數。 

這兩種風格的寫法哪種更好? 

其實網上各有各的說法, 

就本人而言, 我更支援前者這種寫法, 原因之一就是我學 c 語言入門的時候使用的《c 語言入門經典》(ivor horton 著)就是這種寫法, 習慣使然。 另外乙個

原因主要是以下這個例子:

int *pa, pb; 

int* pa, pb;

pa 是指標變數, 這沒有疑問, 那麼 pb 呢? 通過編譯發現, 編譯器認為 pa 是乙個指標變數, 而 pb 則是乙個一般變數。也就是說編譯器並不認為「 int* 」是乙個整體。 這時候, 第一種寫法就顯示出優勢來了, 這裡的「*」僅僅作為乙個修飾符, 表示後面的 pa 是乙個指標變數。 

那麼是不是第一種說法就更好呢? 其實不然, 恰恰相反, 我雖然支援第一種寫法, 因為它更加一目了然, 我可以知道有變數名前面帶著「*」的就是指標變數, 反之則不是。 但是我更支援將「 int* 」作為乙個整體, 表示資料型別。 這對於我們理解指標是有幫助的,如果還使用第一種說法, 你會發現面對一些複雜的指標的時候你無法理解。 比如: 二重指標、 陣列指標、 函式指標等。 這些東西會在下篇博文中提到, 這也是很常見的筆試題。 你完全理解了的話, c 語言的精髓你就懂了一大半了。

2017 年 7 月 8 日

kilento

C語言中幾個番外解釋

作用 避免同乙個檔案被包含多次。pragma once 不開啟檔案,所以只能避免同乙個檔案被包含多次,指的是同乙個檔案,不包括內容相同的兩個檔案。ifdefine endif是從語言中的巨集定義,避免檔案多次編譯,會開啟檔案,所以能保證內容完全相同的兩個檔案也不被重複包含 作用 儲存當前報警設定 只...

C語言篇 指標(一)

指標就是位址,位址就是指標,指標變數就是存放記憶體單元編號的變數。1 基本型別的指標 2 指標和陣列 3 指標和函式 4 指標和結構體 5 多級指標 1 表示一些複雜的資料結構 2 快速的傳遞資料 3 使函式返回乙個以上的值 4 能直接訪問硬體 5 能夠方便的處理字串 6 是理解物件導向語言中引用的...

C語言雜談 指標篇

指標是c語言的難點,其原因是它擁有多重的含義。這給已熟練理解c語言指標精髓的程式設計師帶來的好處是,可以天馬行空的構建軟體。但很不幸,我不是那些能夠熟練理解並天馬行空利用c指標的一員。對於我來說,是不是指標只有置之高閣了呢?答案是否定的,我們前面說過 c指標成為難點的原因是因為它擁有多重含義 這讓我...