都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?蘭亭翰墨華夏韻2019-06-29 01:46:45

不會用或者用不好指標就不是一個合格的C程式設計師,這個問題沒有任何可爭辯的餘地。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?周林ZhouLin2019-06-29 01:23:17

1。 分析問題

整個問題,從提問者的角度,等價於兩個子問題:

子問題1:為什麼C語言要引入指標?

子問題2:指標怎麼才能用好?

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

2。 子問題1的分析

現在來分析子問題1。要回到這個問題,要回顧計算機程式的執行原理:

現代通用計算機基本上都遵循馮·諾依曼結構。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

馮·諾依曼結構的精髓在於:將計算機指令與資料一視同仁,都放入記憶體中處理。所以計算機程式執行的過程,實際上就是不斷從記憶體中取出指令,再從記憶體中取出資料,指令作用於資料得到結果,結果再放回記憶體的過程。

從這個過程可以看出,程式的整個執行都是圍繞記憶體進行的。既然指令和資料都放在記憶體中,那麼執行哪條指令、取哪個資料、結果放到哪裡,都需要精確定位記憶體的具體位置。

C語言作為開發Unix作業系統而創造出來的程式語言,天然需要具備作業系統底層的能力;而從上述程式執行的視角來看,所謂的系統底層能力,核心在於對記憶體位置的定位能力。C語言用於對記憶體進行定位的“武器”就是指標。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

一言以蔽之:C語言之所以引入指標,是由C語言誕生的歷史背景和所要承載的歷史使命決定的

——開發作業系統,要用強大的操控系統底層的能力,

系統底層的核心是對記憶體的定位操作。

3。 子問題2的分析

很多同學被指標搞懵的原因在於:大陸的C語言入門的教材基本上都是譚浩強的《C語言程式設計》,這本教材講述指標過於繁瑣,沒有抓住指標的本質。

指標的本質就是記憶體地址。

記住這一點之後,你就可以遊刃有餘了。以下筆者對初學者最容易暈菜的幾個概念進行最凝練的解釋。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

3。1 多級指標

一級指標就是一次性指向目標記憶體地址、二級指標就是分兩段指向最終目標地址(第一級相當於先指向一個“中間驛站”,第二級再從“中間驛站”指向最終目標地址)……依次類推,這樣哪怕給你一個N級指標,你也不會懵逼。

3。2 指標陣列與陣列指標

說白了,考的並不是計算機知識,考的是語文知識:)

兩個術語都是偏正短語:前者的被修飾詞(中心詞)是陣列,後者的被修飾詞(中心詞)是指標;前者這個數組裡的每個元素都是指標,後者這個指標指向的是一個數組(一片連續的記憶體區)。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?IT劉小虎2019-06-27 21:14:30

謝謝邀請。

不能因為難就不用了啊,正所謂“難者不會會者不難”,要知道指標只是C語言的一部分語法而已,而C語言作為一門基礎程式設計工具,大多數人都能學會,指標更不在話下了。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

如果題主能夠熟練使用指標,應該會發現指標真的是C語言的靈魂,離開了指標,C語言只能處理小學算術題了(這裡有些誇張了哈哈,不過相信題主應該能夠明白我的意思。)

結構體指標

在開始舉例討論C語言指標妙處之前,先來看看結構體指標。還是從例項出發,我們首先定義一個結構體型別,它有兩個成員變數,分別是 sleep_time(睡覺時間) 和 work_time(工作時間),然後定義這種型別的變數和指標:

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

可以透過結構體指標 pw 訪問 week 結構體的成員:

(*pw)。sleep_time = 7。0;

這樣寫有點麻煩,因此C語言非常貼心的提供了“->”運算子,所以我們還可以這樣透過結構體指標訪問成員:

pw->sleep_time = 7。0;

為什麼要使用C語言中的指標

看到這裡,題主可能會有疑問:明明使用結構體變數 w 就能很好的讀寫 week 結構體,為什麼還要間接的使用結構體指標呢?這不是麻煩了嗎?

為什麼要使用結構體指標,其實就可以延伸到題主的問題:“C語言為什麼要使用指標?”

是的,僅僅訪問 week 的 sleep_time 成員,只使用結構體變數 w 就足夠了,這時再透過 pw 訪問真的麻煩了。

但是工具會不會帶來方便,要看我們怎麼使用。不能因為高射炮打蚊子不方便就說高射炮沒用

恰當的使用結構體指標,有利於程式設計師寫出更加緊湊,效率更高的C語言程式。一週有五天工作日,兩天週末。一般來說,在工作日(weekday),人們的睡覺時間較短,工作時間較長,所以我們定義 weekday 函式來規劃工作日的時間,相關C語言程式碼如下:

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

而在週末(weekend)則反過來,工作間較短,睡覺時間較長,所以我們定義 weekend 函式來規劃週末的時間,相關C語言程式碼如下,請看:

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

這兩個C語言函式很好的規劃了一週七天的睡覺和工作時間,但是卻並不好用。為什麼呢?因為它倆只在自己內部規劃了,我們外界看不到啊!想在 main() 函式把規劃好的時間打印出來都辦不到,因為它倆在自己內部規劃好以後,就把“規劃書”銷燬了。

這裡把 weekday 和 weekend 函式的區域性變數比作“規劃書”,函式退出後,區域性變數就自動銷燬了。

可能你會說,那我可以把“規劃書”返回給 main 函式啊,讓 weekday 和 weekend 函式有返回值就可以了,相關C語言程式碼如下:

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

是的,這的確是一個解決問題的辦法,main 可以把 weekday 和 weekend 函式的“規劃書”打印出來了。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

但是這種解決問題的辦法有一點臃腫,很多程式設計師把這樣的程式碼稱為“不優雅”的程式碼。

你看,main() 現在有一份空的“規劃書”,需要 weekday 和 weekend 函式處理。weekday 和 weekend 函式能處理,但是它們要複製一份“規劃書”回到自己內部做,這種複製就造成了

空間浪費

此外,weekday 和 weekend 函式做完了規劃書,還要把“規劃書”再從自己內部取出,傳給 main,這就有

時間浪費

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

更節約資源,更有效率的做法是:weekday 和 weekend 函式處理這份“規劃書”時,直接處理 main() 裡的空“規劃書”就可以了。不要複製後再處理,完事了還要在從自己內部傳出。那,weekday 和 weekend 函式應該怎麼修改呢?請看相關C語言程式碼:

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

顯然,利用指標,整個C語言程式碼簡潔多了。weekday 和 weekend 函式接收到的引數都是 main() 裡結構體變數 w 的地址,所以它倆都是直接操作 w 的。這樣就不用在自己的棧幀裡複製一份 w 再處理了,也不用在處理完畢還要 return 給 main 了。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

看到這裡,你可能會說,什麼嘛,不就是用指標代替了結構體做引數嗎?指標說不定比結構體還要耗空間呢!對嗎?一起來看下:結構體變數 w,它佔用記憶體至少兩個 sizeof(double) 的空間(一個 double 型資料通常佔用 8 位元組空間)。

而一個指標,不管它是什麼型別的,在大多數 32 位計算機中,它只佔 4 位元組空間,在大多數 64 位計算機中,它也僅僅佔 8 位元組空間。所以使用指標做weekday 和 weekend 函式的引數,在空間上,絕對是比直接使用 week 結構體節約空間的,何況指標還提升了效率,簡潔了程式碼。

如果只是一個 char 型變數,它只佔用 1 位元組空間,這時使用指標的確更浪費空間。但是如果是一個非常複雜的結構體,它佔用的記憶體空間甚至幾千位元組,這時使用指標就非常節約空間了。所以說,工具是死的,人是活的。

從這個例子來看,相信題主已經瞭解C語言指標在節約空間,提升程式效率方面的作用了。事實上,這裡介紹的僅僅是

指標的冰山一角

,如果題主堅持學習和使用C語言,你會愈發覺得指標的強大的。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?

歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。

都說C語言的指標很難,用不好很容易出錯,那為何還要用指標呢?你能舉例說說嗎?七彩霓裳992019-06-27 22:59:30

你想引用一塊資料,資料內容不確定,只知道資料存放地址,怎麼引用最方便又靈活?當然是使用指向該資料的地址了。這是最常見的一種情況,實際上在C語言裡指標的用法非常多,多重指標也常見,生成的機器碼簡潔高效。學習C語言指標是必不可少的