為什麼使用指標

2021-05-23 07:59:13 字數 954 閱讀 9627

在實際程式設計中,既然使用變數就可以訪問資料,為什麼還用指標呢?使用指標來操縱自動變數的唯一原因是,為了說明指標的工作原理。指標真正的用途是被用於完成下列3種任務:

管理自由儲存區中的資料

訪問類的成員資料和函式

按引用傳遞引數

在「函式的 工作原理 」中,提到了5個記憶體區域:

全域性命名空間

自由儲存區

暫存器**空間

堆疊區域性變數和函式引數位於堆疊中:當然,**位於**空間中;而全域性變數位於全域性命名空間中;暫存器用於內部管理工作,如記錄棧頂指標和指令指標。餘下的所有記憶體都被作為自由儲存區,通常被稱為堆。

區域性變數不是永久性的,函式返回時,區域性變數就被刪除。這很好,因為這意味著根本不用為管理這種記憶體空間而勞神;也不好,因為這使得函式在不將堆中的物件複製到呼叫函式中的目標物件的情況下,將難以建立供其他物件或函式使用的物件。全域性變數解決了這種問題,其代價是整個程式中都可以訪問它們。這導致建立了難以理解和維護的**。如果管理得當,將資料儲存在自由儲存區可以解決這兩種問題。

可以將自由儲存區視為一塊很大的記憶體,其中有數以千計的依次被編號的記憶體單元,可用於儲存資料。與堆疊不同,你不能對這些單元進行標記,而必須先申請記憶體單元的位址,然後將它儲存到指標中。

函式返回時,堆疊被自動清空。所有區域性變數都不在作用域內,他們被從堆疊中刪除。程式結束前,自由儲存器不會自動清空,程式設計師使用完自己分配的記憶體後,必須負責將其釋放。

自由儲存區的優點是,你從中分配的記憶體將一直可用,知道你明確的指出不再需要——將其釋放為止。如果在函式中分配自由儲存區中的記憶體,在函式返回後該記憶體仍可用。

這也是自由儲存區的缺點,如果你忘記釋放記憶體,被佔據而沒有使用的記憶體將隨著時間的推移愈來愈多,導致系統崩潰。

採用這種記憶體訪問方式而不是全域性變數的優點是,只有能夠訪問指標的函式才能訪問它指向的資料。這樣只有將包含指標的物件或指標本身傳遞給函式,函式才能修改指標指向的資料,從而減少了函式能夠改變資料,而又無法跟蹤變更的情況發生。

為什麼使用二級指標

設計乙個函式 void find1 char array,char search,char pa 要求 這個函式引數中的陣列array是以 0值為結束的字串,要求在字串array中查詢與引數search給出的字元相同的字元。如果找到,通過第三個引數 pa 返回array字串中首先碰到的字元的位址。如...

陣列指標為什麼不能使用strcpy

程式設計中遇到的問題,終於弄明白了 例程說明如下 include include int main char argv,char argc 編譯時不會出錯,但是執行時會出錯,你定義char b 10 時b 10 的每個元素是乙個指標,指向字元型的,但是指向的位址是隨機的,是不確定的,所以strcpy...

1 為什麼要有指標?

0 史前 早期的cpu 也許並沒有真正的實現 並不如今天的強大,記憶體讀寫的指令可能只有 從 常數 0x1234位址處讀入1位元組到暫存器a 或者 把暫存器b的值寫入 常數 位址0x5678這個地方 那個時候沒有變數這一說,所有的記憶體讀寫都得指定好常數,也就是得把具體的數字 也稱為字面量,lite...