回覆列表
-
1 # java攻城獅
-
2 # A股行情總導演
指標就是房間號,資料就是房間裡的東西。你告訴服務員房間號,他就能正確從房間裡取資料。
函式就是一臺機器,他負責處理專門的過程。你輸入棉線,機器就能輸出一匹布給你。
-
3 # java菜雞成長之路
我開始也不太瞭解指標,但是後面我看了《從零學C語言》然後我就知道指標這東西了。要了解指標,先要了解其定義。我上兩圖,你細品。你就知道了。然後做一道簡單的體你就有體會了。帶著以下問題去看吧:指標定義。什麼是記憶體單元的地址,什麼是記憶體單元的內容。*和&符號代表什麼意思。帶著問題去看。我相信你會有所頓悟。
如果你看完,覺得指標看明白了,然後我再解釋函式。
講清楚前因後果就好了。大家講指標總喜歡做各種花哨的類比,其實沒必要,你只要把指標存在的邏輯說清楚,很多東西就自然而然地明白了。
1.我要給某個函式傳遞引數,如果傳遞存有原始資料的變數,實質上是把你變數中的資料複製了一份給目標函式(這是c傳參的特點,我們叫做傳值呼叫)。而如果傳遞的是原始資料的指標,因為指標就是存放地址的變數,你把原始資料的地址給了這個函式,它就有能力直接操縱原始資料(一般叫做透過引用呼叫)。
2.我要把一串數排序。但我很貪心,我想造個框架,使得它能給任何資料型別比較大小。實際呼叫時,我只需要在比較之前傳入一段程式碼,告訴它我是怎樣定義傳入資料的大小的即可。(這就很自由了,比如說我可以定義貓大於狗,人大於貓,然後傳入貓狗貓狗人人,讓這個框架給我排序)
我要如何傳入這段程式碼?程式碼存在記憶體中,我只要告訴這個框架,我的程式碼在第幾行就可以了。怎麼告訴它呢?指標啊!指標存的就是地址,傳入指標就相當於告訴這個框架我的程式在第幾行嘛(這也是系統庫函式stdlib中qsort函式的做法)。這種玩法,我們叫“指向函式的指標”。
諸如此類的玩法還有很多,在此不作一一列舉。一句話:學習指標一定要結合實際問題。直觀的方法就是多寫程式碼,寫的多了你自然就會有很多疑問,之後再看指標,或者後面的內容,你就會發現,原來還有這麼簡單的解決方法啊。
多說一句,這也就是為什麼我們說c語言和硬體聯絡比較緊密的原因。我們以Python為例,Python抽象做的非常好,即使你對計算機硬體一無所知也沒關係,你只需要接受它告訴你的那一套邏輯框架就可以工作了;c則不同。c本身就不打算將你的思考邏輯和硬體剝離開。你使用c,就不得不關心你的程式碼是怎樣實現的——這也是他的核心競爭力,因為直接操作硬體可以做許多你在抽象出來的高層次中做不了的事情。c為你提供了直接操作硬體的工具,指標就是其中之一。這些工具很強大,但也需要操作者有同樣強大的本領才能完全駕馭。