回覆列表
  • 1 # IT劉小虎

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

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

    結構體指標

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

    可以透過結構體指標 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語言程式碼如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

    從這個例子來看,相信題主已經瞭解C語言指標在節約空間,提升程式效率方面的作用了。事實上,這裡介紹的僅僅是指標的冰山一角,如果題主堅持學習和使用C語言,你會愈發覺得指標的強大的。

  • 2 # 七彩霓裳99

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

  • 3 # 周林ZhouLin

    1. 分析問題

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

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

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

    2. 子問題1的分析

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

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

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

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

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

    一言以蔽之:C語言之所以引入指標,是由C語言誕生的歷史背景和所要承載的歷史使命決定的——開發作業系統,要用強大的操控系統底層的能力,系統底層的核心是對記憶體的定位操作。

    3. 子問題2的分析

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

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

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

    3.1 多級指標

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

    3.2 指標陣列與陣列指標

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

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

  • 中秋節和大豐收的關聯?
  • 才高八斗的金庸為什麼不寫關於秦朝、漢朝和唐朝的小說?