1. 程式人生 > >BuildYourOwnLisp Why we need pointer 為什麼我們需要指標

BuildYourOwnLisp Why we need pointer 為什麼我們需要指標

指標

在 C 語言中,要表示列表,就必須正確的使用指標。C 語言中的指標一直如洪水猛獸般存在。雖然概念上非常簡單,但是用起來卻變幻多端,神祕莫測,這使得指標看上去比實際要可怕得多。幸運的是,在本書中我們只會用一些指標在 C 語言中最常規的用法。

我們之所以需要指標,主要是由 C 語言中函式的工作方式決定的。C 語言函式的引數全部是通過值傳遞的。也就是說,傳遞給函式的實際是實參的拷貝。對於 int、long、char等系統型別以及使用者自定義的結構體都是成立的。這種方式適用於絕大多數情況,但也會偶爾出現問題。

一種常見的情況是,如果我們有一個巨大結構體需要作為引數傳遞,則每次呼叫函式,就會對實參進行一次拷貝,這無疑是對效能和記憶體的浪費。

另外一個問題是,結構體的大小終究是有限的,無論多大,也只能是個固定的大小。而如果我們想向函式傳遞一組資料,而且資料的總數還是不固定的,結構體就明顯的無能為力了。

為了解決這個問題,C 語言的開發者們想出了一個聰明的辦法。他們把記憶體想象成一個巨大的位元組陣列,每個位元組都可以擁有一個全域性的索引值。這有點像門牌號:第一個位元組索引為 0,第二個位元組索引為 1,等等。

在這種情況下,計算機中的所有資料,包括當前執行的程式中的結構體、變數都有相應的索引值與其對應(資料的開始位元組的索引作為整個資料的索引)。所以,除了將資料本身拷貝到函式引數,我們還可以只拷貝資料的索引值。在函式內部則可以根據索引值找到需要的資料本身(譯者注:我們將這個索引值稱為地址,儲存地址的變數稱為指標)。使用指標,函式可以修改指定位置的記憶體而無需拷貝。除此之外,指標還可以做其他很多事情。

因為計算機記憶體的大小是固定的,表示一個地址所需要的位元組數也是固定的。但是地址指向的記憶體的位元組數是可以變化的。這就意味著,我們可以建立一個大小可變的資料結構,並將其指標傳入函式,對其進行讀取及修改。

所以,所謂的指標也僅僅是一個數字而已。是記憶體中的一塊資料的開始位元組的索引值。指標的型別用來提示程式設計師和編譯器指標指向的是一塊什麼樣的資料,佔多少個位元組等。

指標型別是在現有型別的後面加一個星號組成,我們之前已經見過一些指標的示例了,如:mpc_parser_t*、mpc_ast_t* 以及 char*。

要建立指標,我們就需要獲取資料的地址。C 語言提供了取地址符(&)來獲取某個資料的地址。在前面的章節中,我們也曾傳給過 mpc_parse 函式一個指標,以便其能將輸出放到我們宣告的 mpc_result_t 變數中。

最後,為了獲取指標所指向的地址的資料值(稱為解引用),我們需要在指標左邊使用 * 操作符。要獲取結構體指標的某個欄位,需要使用 -> 操作符,而不是 .,這你在第七章已經見過了。
--------------------- 
作者:主席之力 
來源:CSDN 
原文:https://blog.csdn.net/gx262091291/article/details/51580370 
版權宣告:本文為博主原創文章,轉載請附上博文連結!