回覆列表
  • 1 # TonyDeng

    指標是一個抽象概念,英文單詞pointer,是指示器的意思,用以指引如何尋找一個物件,猶如教師的教鞭,順著指示的途徑就可以找到目標。

    C語言的指標是該語言pointer的一種用法,它是一個int型變數,變數的值是一個記憶體地址(記憶體地址恰好也是一個int資料的尺寸),這個地址是一個數據物件x的入口,我們讀取指標p的值,就是獲取該物件x的入口地址,然後透過解引用算符*p把x的值讀出來;如果要得到x的地址,使用&x即可。

    指標的值是一個地址入口,此處的資料可能是各種各樣的資料型別,那麼指標必須附帶是何種資料型別的資訊,那就是指標的型別定義。看如下程式碼:

    double x=3.14;

    double* p=&x;

    這裡變數x是一個記憶體變數,其值是3.14,指標p指向x的地址,其宣告double告訴編譯器p地址處是一個double型資料,那麼程式到此處提取資料時,就按double型的法則處理,即讀入8個位元組。注意此處有個陷阱,你想知道就問,先不說。

    指標不一定總是資料,也可以是一段程式碼的入口地址,如果是這樣使用,程式就跳轉到此處開始執行,即所謂函式指標。這就是我前面一直說“指標是入口地址”的意思。

    一般地,棧上資料,其變數名本身就視為指標,不必刻意另外用一個指標指向它,指標的用途,是指向堆上的資料。比如,在堆上申請一塊記憶體空間的程式碼:

    char* p = (char*)malloc(1024);

    這是從堆上分配1024個位元組的空間,這塊空間是沒有變數名的,為此,我們在棧上用一個指標變數p註冊這塊空間,p就是這個空間的入口,也可視為一個數組x[1024]的起始地址,*p就是x[0],*(p+1)就是x[1],++p之後,p是x[1]的地址(這裡又有一個陷阱,注意了)。

    先說這麼多,說不完的。

  • 2 # 網際網路小杜

    寫簡單的程式的話不用指標也行了吧. 比如, int a = 2; int* p = &a; *p = 3; 這裡a是一個地址(編譯後), 為了讀寫這個地址單元裡的東西,可以用p,也可以用一般變數a. 對於指標的便利,我現在能想到的,可能是: 函式A呼叫函式B時,把一個記憶體塊的地址傳遞過去,這樣可以避免按值傳遞時開闢一個棧空間並逐一複製記憶體塊裡的值的開銷(C++裡的複製建構函式在做這件事),並且A,B函式操作的都是同一個記憶體塊裡的東西,如果這就是目的,那麼傳指標就是很有效率的做法(如果不用指標就可能要用一個全域性的變量了). 用一個指標(函式指標)存放一系列同類型的函式名(入口地址),方便函式呼叫. void*型別指標可以存放任何型別指標. 讓父類型別指標指向任何子類物件可以實現動態繫結. 寫著寫著似乎指標還挺有用,呵呵. 我相信指標的使用一定要很小心,否則可能要忍受程式報錯而總找不到錯在何處的痛苦. 有一些比較極端的例子, 如一個函式返回了一個函數里區域性變數的指標,一用就出錯; 如宣告一個指標沒有分配空間就傳給別一函式使用; 如多個執行緒都在使用同一個記憶體塊,你修我改,甚至有人把它刪掉了或不小心讓指標指向系統用的記憶體,另一個人還準備往裡讀寫東西---可能要費心思來同步. 如指標指向的記憶體可能是new/malloc出來的,可能要想辦法及時刪除並要保證沒有別的執行緒要用...

  • 中秋節和大豐收的關聯?
  • 你怎麼看待杜蘭特G3的爆發?