[摘要]
指標是c和c++語言程式設計中最重要的概念之一,也是最容易產生困惑並導致程式出錯的問題之一。利用指標程式設計可以表示各種資料結構, 通過指標可使用主調函式和被調函式之間共享變數或資料結構,便於實現雙向資料通訊;並能像組合語言一樣處理記憶體位址,從而編出精練而高效的程式。指標極大地豐富了c和c++語言的功能。
在本文中,主要分兩部分對指標進行討論。首先,基礎篇討論關於指標的內容和運算操作等,可以是讀者對指標的知識有一定了解和認識;隨後在使用篇中重點討論指標的各種應用,揭破指標在日常程式設計中的精髓,從而使讀者能夠真正地了解、認識和使用指標。
第一篇:基礎篇
1.1指標的概念
談到指標,它的靈活性和難控制性讓許多程式設計師談虎色變;但它的直接操作記憶體,在資料
操作方面有著速度快,節約記憶體等優點,又使許多c++程式設計師的深愛不以。那麼指標究竟是怎麼樣乙個概念呢?
其實, 指標就是一類變數,是一類包含了其他變數或函式的位址的變數。與其他變數所不同的是,一般的變數包含的是實際的真實的資料,而指標是乙個指示器,它告訴程式在記憶體的哪塊區域可以找到資料。
1.2指標的內容
簡單講,指標有四個方面的內容:即指標的型別,指標所指向的型別,指標的值,指標本身所
占有的記憶體區。下面我們將分別闡述這些內容。
1.2.1指標的型別
從語法的角度看,指標的型別是指把指標宣告語句中的指標名字去掉所剩下的部分。這是指標本身所具有的型別。例如:
int*ip; //指標的型別是int*
char*ip; //指標的型別是char*
int**ip; //指標的型別是int**
int(*ip)[5]; //指標的型別是int(*)[5]
1.2.2指標所指向的型別
當你通過指標來訪問指標所指向的記憶體區時,指標所指向的型別決定了編譯器將把那片記憶體區里的內容當做什麼型別來看待。從語法的角度看,指標所指向的型別是指標宣告語句中的指標名字和名字左邊的指標宣告符*去掉所剩下的部分。例如:
int*ip; //指標所指向的型別是int
char*ip; //指標所指向的型別是char
int**ip; //指標所指向的型別是int*
int(*ip)[5]; //指標所指向的型別是int()[5]
1.2.3指標的值(或稱指標所指向的記憶體區)
指標的值或者叫指標所指向的記憶體區或位址,是指標本身儲存的數值,這個值將被編譯器當作乙個位址,而不是乙個一般的數值。在32位程式裡,所有型別的指標的值都是乙個32位整數,因為32位程式裡記憶體位址全都是32位長。 指標所指向的記憶體區就是從指標的值所代表的那個記憶體位址開始,長度為sizeof(指標所指向的型別)的一片記憶體區。以後,我們說乙個指標的值是xx,就相當於說該指標指向了以xx為首位址的一片記憶體區域;我們說乙個指標指向了某塊記憶體區域,就相當於說該指標的值是這塊記憶體區域的首位址。
指標所指向的記憶體區和指標所指向的型別是兩個完全不同的概念。在上例中,指標所指向的型別已經有了,但由於指標還未初始化,所以它所指向的記憶體區是不存在的,或者說是無意義的。
以後,每遇到乙個指標,都應該問問:這個指標的型別是什麼?指標指的型別是什麼?該指標指向了**?
1.2.4指標本身所占有的記憶體區
指標本身所占有的記憶體區是指標本身佔記憶體的大小,這個你只要用函式sizeof(指標的
型別)測一下就知道了。在32位平台裡,指標本身佔據了4個位元組的長度。
指標本身佔據的記憶體這個概念在判斷乙個指標表示式是否是左值時很有用。
談C C 指標精髓(三)
1.4指標的運算 1.4.1賦值運算 指標變數的賦值運算有以下幾種形式 1.4.1.1指標變數初始化賦值如下 int a int ip a 1.4.1.2把乙個變數的位址賦予指向相同資料型別的指標變數。例如 int a int ip ip a 把整型變數a的位址賦予整型指標變數ip 1.4.1.3把...
c c 指標詳解(一)
1 首先需要了解指標的作用 指標是用來存放資料位址的。就是說,開發者可以使用乙個指標變數,存放變數 函式 指標的位址。如int a 0 int p a 這時就將a的位址存放在了變數p的記憶體空間中,不過這個變數p就是我們下來需要了解的指標變數。2 既然指標變數中存放的是記憶體位址,能不能使用基本資料...
C C 指標雜談(一)
在這樣乙個定義中int p 這樣就定義了乙個指標變數,p是它的名字,int是它的型別,他現在儲存的位址是一塊不清不楚的位址 這就是乙個野指標 現在使用它時,會造成乙個執行時錯誤,這種情況是一定要避免了,當不知道乙個指標該指向什麼地方時,應該把它指向空的,如int p null 這樣定義,這個指標才是...