国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++指針變量的定義和使用

2020-05-23 14:27:18
字體:
供稿:網(wǎng)友

指針的類型

同變量的數(shù)據(jù)類型類似,指針也有類型。之所以指針會有類型,是為了符合對應(yīng)的變量或常量數(shù)據(jù)類型。要注意,指針本身也是一種數(shù)據(jù)類型。

不同指針類型的本質(zhì)在于不同的操作。這點和快捷方式是類似的。比如雙擊一個可執(zhí)行文件(.EXE)快捷方式的操作是運行這個可執(zhí)行文件,而雙擊一個Word文檔文件(.DOC)快捷方式的操作是使用Word程序打開這個文檔。類似地,一個字符型數(shù)據(jù)在內(nèi)存中占用一個字節(jié),那么讀取數(shù)據(jù)就應(yīng)以字符型數(shù)據(jù)讀出一個字節(jié);一個長整型數(shù)據(jù)在內(nèi)存中占用四個字節(jié),那么讀取數(shù)據(jù)時就應(yīng)以長整型數(shù)據(jù)讀出四個字節(jié)。如果指針類型與它所指向的數(shù)據(jù)類型不匹配,就可能對數(shù)據(jù)作出錯誤的操作。

指針變量的聲明

指針變量也是一種變量。所以在使用之前,必須先聲明。聲明指針變量的語句格式為:
    指針的類型 *指針變量名;
其中,指針類型應(yīng)該是與指針所指向的數(shù)據(jù)相符合的數(shù)據(jù)類型。比如int、char、float等等。*表示所要定義的是一個指針變量,而不是一個普通變量。指針變量名則應(yīng)該遵循起變量名的一切規(guī)則。
例如:
   char *cptr;//指向字符型變量的指針變量
   int *iptr;//指向整型變量的指針變量

要注意,當我們要聲明多個指針變量時,必須在每個指針變量名前加上*,例如:
   int *iptr1,*iptr2,iptr3;//iptr1和iptr2是指向整型變量的指針變量,而iptr3是整型變量

獲取地址和指針變量初始化

我們已經(jīng)聲明了指針變量,那么我們?nèi)绾潍@得數(shù)據(jù)在內(nèi)存中的地址呢?

在C++中,用&操作符可以獲取變量或常量在內(nèi)存中的地址,我們稱之為取地址操作符。它的使用格式是:
    &變量名或常量名
既然能夠獲取到數(shù)據(jù)所在的地址,我們就能把這個地址交給指針了。例如:
    int c=9;
    int *iptr=&c;//聲明指向整型變量的指針變量,并作初始化

這時,我們稱指針iptr指向了變量c。在第三章我們說過,聲明一個未經(jīng)初始化的變量之后,它的值是無法確定的。所以如果聲明了一個指針卻不對它作初始化,那么它所指向的內(nèi)容也是無法確定的,而這種情況是十分危險的。

特殊的值——NULL

沒有初始化的指針變量是危險的。可是如果在聲明變量之后,找不到合適的地址進行初始化,我們該怎么辦呢?顯然,隨便找個地址對指針變量做初始化是不負責任的。
在這里,我們引入一個特殊的地址——NULL。它的意思是“空”,即指針沒有指向任何東西。比如:
    int *iptr=NULL;
要注意的是,C++是大小寫敏感的,NULL與null是不同的。所以,在使用的時候必須要大寫。

指針的使用——間接引用

雙擊一個有效的快捷方式,就能夠調(diào)用對應(yīng)的文件,那么我們通過什么方法才能操作指針所指向的變量呢?
在這里,*又出現(xiàn)了,它稱為間接引用操作符。其作用是獲取指針所指向的變量或存儲空間。間接引用的指針可以作為左值。(關(guān)于左值概念請參見第三章)具體的使用格式為:
    *指針變量名

下面,我們來看一段程序,實踐一下如何使用指針變量:(程序8.2)
#include "iostream.h"
int main()
{
   int i=3;
   int *iptr=&i;
   int **iptrptr=&iptr;//iptr也是變量,也能夠獲取它的地址
   cout <<"Address of Var i=" <<iptr <<endl;//輸出iptr存儲的內(nèi)容,即i在內(nèi)存中的地址
   cout <<"Data of Var i=" <<*iptr <<endl;//輸出iptr所指向的變量
   cout <<"Address of Pointer iptr=" <<iptrptr <<endl;//輸出iptr在內(nèi)存中的地址
   cout <<"Address of Var i=" <<*iptrptr <<endl;//輸出iptrptr所指向的變量,即iptr
   *iptr=2+*iptr;//*iptr可以作左值
   cout <<"Data of Var i=" <<*iptr <<endl;
   return 0;
}

運行結(jié)果:
Address of Var i=0x0012FF7C
Data of Var i=3
Address of Pointer iptr=0x0012FF78
Address of Var i=0x0012FF7C
Data of Var i=5

通過運行結(jié)果,我們可以知道變量i在內(nèi)存中的地址是0012FF7C(前面的0x表示這是一個十六進制的數(shù));指針也是一種變量,在內(nèi)存中也有地址;間接引用指針以后就和使用指針指向的變量一樣方便。

試試看:
1、如果將程序8.2中的所有整型變量換成字符型變量(把對應(yīng)的變量數(shù)據(jù)也換成字符),則執(zhí)行后會有什么奇怪的現(xiàn)象?請根據(jù)第七章的知識,猜想產(chǎn)生這個奇怪現(xiàn)象的原因。
2、如果聲明一個指針變量后不對其進行初始化,而是將其間接引用,作為左值修改它所指向的內(nèi)存中的數(shù)據(jù),會有什么結(jié)果產(chǎn)生?
結(jié)論:在沒有保護措施的操作系統(tǒng)中,這樣的操作可能會導致系統(tǒng)錯誤甚至崩潰。
3、能否將一個常量的地址賦值給一個對應(yīng)類型的指針變量?
結(jié)論:將一個常量的地址賦給指針變量可能導致通過指針更改常量,所以是不合法的。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桃源县| 英德市| 大庆市| 民勤县| 延安市| 余干县| 河池市| 鄂尔多斯市| 宝应县| 石台县| 霸州市| 三原县| 连城县| 集贤县| 金阳县| 长乐市| 潢川县| 道孚县| 山丹县| 永德县| 宝兴县| 金川县| 西平县| 桐柏县| 金门县| 霍山县| 贞丰县| 余江县| 外汇| 蛟河市| 青海省| 义乌市| 麦盖提县| 两当县| 舒兰市| 南通市| 青阳县| 东丰县| 嘉义县| 拉萨市| 兖州市|