復合型別是指基於其他型別定義的型別。接下來介紹c++復合型別中的兩種:應用和指標。
通過將宣告符寫成&d的形式來定義應用資料型別,其中d是宣告的變數名。
int a = 0;//宣告基本資料型別
int &refa = a;//宣告引用資料型別,refa指向a,是a的另外乙個名字
int &refb;//錯誤,引用必須被初始化
為什麼說引用即別名呢?因為定義引用時,初始化完成後,引用將和它的初始值物件一直繫結在一起。簡單的乙個例子是:
int a = 0;
int b = a;
int &refa = a;
std::cout
<< "b:"
<< b << std::endl;
std::cout
<< "refa:"
<< refa << std::endl;
b = 1;
std::cout
<< "change b"
<< std::endl;
std::cout
<< "b:"
<< b << std::endl;
std::cout
<< "a:"
<< a << std::endl;
refa = 1;
std::cout
<< "change refa"
<< std::endl;
std::cout
<< "refa:"
<< refa << std::endl;
std::cout
<< "a:"
<< a << std::endl;
執行結果是:
b
:0refa
:0changebb
:1a:0change
refa
refa:1a
:1
由此我們可以看到,當宣告引用refa,並賦值a之後,refa其實就是a的乙個別名,改變refa也就是改變a。
由於初始化完成後,引用將和它的初始值物件一直繫結在一起,所以無法令引用重新繫結在另乙個物件。
與引用類似,指標也實現了對其他物件的間接訪問。然而指標與引用相比有很對不同點。其一,指標本身就是乙個物件,允許對指標賦值和拷貝,而且在指標的生命週期內它可以先後指向幾個不同的物件。其二,指標無需在定義時賦初值。
定義指標型別的方法將宣告符寫成*d的形式,其中d是變數名。指標存放某個物件的位址,要想獲取該位址,需要使用取位址符(操作符&)。
int i = 1;
int*p = &i;
需要注意的是,因為引用不是物件,只是乙個物件的別名,沒有實際位址,所以不能定義指向引用的指標。
指向乙個物件
指向緊鄰物件所佔空間的下乙個位置
空指標,意味著指標沒有指向任何物件。
無效指標,也就是上述情況之外的其他值。
如果指標指向了乙個物件,則允許使用解引用符(操作符*)來訪問該物件。
int i = 1;
int *p = &i;
std::cout
<< p;//位址
std::cout
<< *p;//物件
上面的**會輸出:
0x28ff28
1
對指標解引用會得出所指的物件,因此如果給解引用的結果賦值,實際上也就是給指標所指的物件賦值:
int i = 1;
int *p = &i;
std::cout
<< *p << std::endl;
std::cout
<< i << std::endl;
*p = 2;
std::cout
<< *p << std::endl;
std::cout
<< i << std::endl;
輸出為:
112
2
像&和*這樣的符號,既能用作表示式裡的運算子,也能作為宣告的一部分出現,符號的上下文決定符號的意義:
int i = 1;
int &r = i;//緊隨型別名出現,r是乙個引用
int *p;//緊隨型別名出現,p是乙個指標
p = &i;//出現在表示式中,是乙個取位址符
*p = i;//出現在表示式中,是乙個解引用符
int &r2 = *p;//r2是引用,*是乙個解引用符
有時候要想搞清楚一條賦值語句到底是改變了指標的值還是改變了指標所指物件的值不太容易,最好的方法就是記住賦值永遠改變的是等號左側的物件。
int i = 1;
int *pi = 0
//當前pi沒有指向任何物件
pi = &i;//pi的值被改變,現在pi指向了i
*pi = 0;//i的值被改變,指標pi並沒有改變
C 復合型別(1)
復合型別 compound type 是指基於其他型別定義的型別。c 語言有幾種復合型別,這裡將介紹兩種復合型別引用和指標。與我們已經掌握的變數宣告相比,定義復合型別的變數要複雜很多。一條簡單的宣告語句由乙個資料型別和緊隨其後的乙個變數名列表組成。其實更通用的表述是,一條宣告語句由乙個基本資料型別 ...
C 學習筆記 復合型別 陣列
陣列 array 宣告應指出下面三點 1 儲存在每個元素中的值的型別 2 陣列名 3 陣列的元素數 宣告陣列的通用格式如下 typename arrayname arraysize arrrysize指的是陣列的大小,不能為變數,必須為常量。c 陣列的元素可以單獨訪問,方法是使用下標或者索引進行編號...
C 學習筆記 復合型別(2
指標 備受折磨 int ip1,ip2 ip1和ip2都是指向int型物件的指標 double dp,dp2 dp2是指向double型物件的指標,dp是double型物件指標與引用的不同點 1.指標本身就是乙個物件,允許對指標賦值和拷貝,而且在指標的生命週期內它可以先後指向幾個不同的物件。2.指標...