C++ Primer-第二章-筆記

第二章 變量和基礎

2.3 複合類型

2.3.1 引用

2.3.2 指針

做爲一種複合類型,與引用類似,指針實現了對其餘對象的間接訪問:指針

  • 指針自己就是一個對象,容許對指針賦值和拷貝,並且在指針的生命週期內它能夠前後指向幾個不一樣的對象。code

  • 指針無須在定義時賦初值。和其餘內置類型同樣,在塊做用域內定義的指針若是沒有被初始化,也將擁有一個不肯定的值。對象

2.3.2.1 定義指針類型*

定義指針類型的方法將聲明符寫成*d的形式,其中d是變量名。若是在一個語句中定義了幾個指針變量,每一個變量面前都必須有符號*生命週期

int *ip1,*ip2;     
double dp,*dp2;

2.3.2.2 獲取對象的地址&

指針存放某個對象的地址,要想獲取該地址,須要使用取地址符(操做符&)ip

int *ip1, *ip2;    // ip1和ip2是指向int型對象的指針
double dp, *dp2;    // dp2是指向double型對象的指針,dp是double型對象

在聲明語句中,指針的類型實際上被用於指定它所指向的對象的類型,因此兩者必須匹配。若是指針指向了一個其餘類型的對象,對該對象的操做將發生錯誤。作用域

2.3.2.3指針值

指針的值(即地址)應屬下列4種狀態之一:編譯器

  1. 指向一個對象。編譯

  2. 指向緊鄰對象所佔空間的下一個位置。基礎

  3. 空指針,意味着指針沒有指向任何對象。變量

  4. 無效指針,是除上述狀況的其餘值。試圖拷貝或以其餘方式訪問無效指針的值都將引起錯誤,編譯器並不負責檢查此類錯誤。

儘管第2種和第3種形式的指針是有效的,但顯然這些指針沒有指向任何具體對象,因此試圖訪問此類指針(假定的)對象的行爲不被容許。

2.3.2.4 利用指針訪問對象

若是指針指向了一個對象,則容許使用 解引用符(操做符*)來訪問該對象。

int ival = 42;
int *p = &ival;    // p存放着變量ival的地址,或者說p是指向變量ival的指針
cout << *p;

對指針解引用會得出所指的對象,所以若是給解引用的結果賦值,實際上也就是給指針所指的對象賦值:

*p = 0;
cout << * p

【注意】解引用操做僅適用於那些確實指向了某個對象的有效指針。

&*,既能做表達式裏的運算符,也能做爲聲明的一部分出現,符號的上下文決定了符號的意義:

int i = 42;     
int &r = i;    // &緊隨類型名出現,所以是聲明的一部分,r是一個引用
int *p;        // *緊隨着類型名出現,所以是聲明的一部分,p是一個指針
p = &i;        // &出如今表達式中,是一個取地址符
*p = i;        // *出如今表達式中,是一個解引用符
int &r2 = *p;  // &是聲明的一部分,*是一個解引用符

在聲明語句中,&*用於組成複合類型;在表達式中,它們的角色又轉變爲運算符。

2.3.2.5 空指針

空指針(null pointer)不指向任何對象,在試圖使用一個指針以前代碼能夠首先檢查它是否爲空。

相關文章
相關標籤/搜索