[摘要]
指針是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個字節的長度。
指針本身占據的內存這個概念在判斷一個指針表達式是否是左值時很有用。