指標型別是c++、pascal等語言中比較重要的資料型別。在使用上很靈活。在c++中可以使用如下的語句乙個int指標型別:
int*p;
如果要為指標變數賦值,可以使用如下的語句:
intx =
4;int*
p;p =&
x; 對於初學者來說,可能理解指標比較困難。實際上,在定義指標變數時,就相當於為該指標變數分配乙個32位的記憶體空間(4個位元組長)來儲存記憶體位址(僅限於32位作業系統)。為而指標變數賦的值實際上就是乙個變數(可能是簡單型別變數,也可能是複雜型別變數)的首位址。對於32位作業系統來說,不管是什麼型別的變數,位址都是4位的(佔乙個int型別的空間)。 對於兩個指向同乙個位址的指標變數,改變乙個指標變數所指向的資料,都麼另乙個指標變數所指向的資料也將改變,如下面的**所示:
intx =
4;int*
p1,
*p2;
p1 =
&x; p2 =&
x;*p1 =12;
printf("%d
", *p2);
上面的**將輸出12。
對於指標的概念及用途,我們也可以做乙個形象的比喻。假設有兩個儲物箱a和b。有兩個人p1和p2。 在a中放置了很多東西,而b是空的。p1擁有a和b的鑰匙,而p2只擁有b的鑰匙。並且p1不能直接給p2鑰匙。 那麼p2該如何取得a中的物品呢?(注意,不能直接把a撬開哦,要用鑰匙開啟)。
方法嗎有如下兩個:
1. p1將a和b開啟,將a中的物品放在b中。
2. p1只將b開啟,將a的鑰匙放在b中。
第一種方法是直接將a中的物品放在了b中,這麼做的好處是無論a發生的什麼事,都不會影響b中的物品。但缺點是太麻煩,而且如果a中物品很多的話,是很浪費時間的。而且b的儲存空間要和a的一樣多才能存放a中所有的物品。
第二種方法是p1通過b將a的鑰匙將給了p2,這種方法的好處是方便,而且b也不需要和a一樣大,實際上,只要能放下一把鑰匙即可。但缺點是a可能不只一把鑰匙,如果其他人使用了a的鑰匙開啟a,並動了a中的物品,那麼會直接影響到p2所取得的物品。
我們可以將a和b看作是記憶體中的兩個儲存區域。對於第一種方法來說,實際上相當於如下的**:
typedef
struct
mystruct;
//相當於a中的物品
mystruct a;
//b引數相當於b儲物箱
void
mymethod(mystruct b)
//將a中的物品放入b中
mymethod(a);
從上面的**可以看出,將a傳入mymethod方法中需要將a中所有的內容複製到mymethod的方法棧中,這是很耗費記憶體資源的。但在mymethod方法中修改b中的內容,並不會影響到a。但如果使用下面的**,就會是另外乙個樣子。
//b引數只用於儲存鑰匙,也就是4個位元組的指標
void
mymethod(mystruct
*b)
//將a的鑰匙(指標)放到b中
mymethod(
&a);
上面的方法很節省記憶體空間,但在mymethod方法中修改b指向的結構體中變數的值,也同樣會影響到a中相應變數的值。
讀者在使用指標時,可以將指標相象成儲物箱的鑰匙。當定義乙個指標變數時,就相當於建立乙個只用於儲放鑰匙的儲物箱。而我們為這個變數賦值時,只能放鑰匙(指標)或相當於鑰匙大小的其他物品。乙個指標變數可以當成乙個int變數來使用,如下面的**也是正確的:
intx =
1234
;int*p;
p =(int
*)x;
上面的**將x中的值強行轉換成了整型指標,實際上,這個指標的值就是1234。也就是說,x變數的值變是乙個記憶體位址了。
那麼指標的指標呢,也就是 int **p;,那麼我們再加乙個儲物箱c吧。b儲存了a的鑰匙,而c儲存了b的鑰匙。只要取得了c的鑰匙,就可以按圖索驥地開啟a。
也就是說 ,對於int **p,p中儲存了是乙個位址,但這個位址指向的記憶體空間儲存了也是乙個位址,而這個位址所指向的記憶體空間儲存的才是真正的資料(int型別)。如果是int ***p,那就再加乙個儲物箱吧。哈哈。
也許有的讀者可能會注意到本文前面所說的第一種方法是將a中的物品放到b中,那麼a中不就沒了,這不就相當於把a變數清空了,哈哈,沒錯。不過這個比喻只是為了使讀者更容易理解指標的含義和優缺點。如果不想把a清空,就把a中的物品想象成可複製的就可以了,如光碟,把a中的光碟複製乙份放到b中,那就更麻煩了。哈哈!
指標與儲物箱的關係
指標型別是c pascal等語言中比較重要的資料型別。在使用上很靈活。在c 中可以使用如下的語句乙個int指標型別 int p 如果要為指標變數賦值,可以使用如下的語句 intx 4 int p p x 對於初學者來說,可能理解指標比較困難。實際上,在定義指標變數時,就相當於為該指標變數分配乙個32...
指標與陣列的關係
指標與陣列的關係 指標與陣列是c語言中很重要的兩個概念,它們之間有著密切的關係,利用這種關係,可以增強處理陣列的靈活性,加快執行速度,本文著重討論指標與陣列之間的聯絡及在程式設計中的應用。1 指標與陣列的關係 當乙個指標變數被初始化成陣列名時,就說該指標變數指向了陣列。如 char str 20 p...
指標與函式的關係
c語言中的指標變數可以指向乙個函式 函式指標可以作為引數傳遞給其它函式 函式的返回值可以是乙個指標值。1 指向函式的指標 函式雖然不是變數,但是它在記憶體中占有實際位置。函式的首位址就是該函式的入口位址,它可以賦給指標變數,使得指標變數指向函式。利用指向函式的指標變數,可以代替函式名,也可以作為函式...