指標——備受折磨
int
*ip1,
*ip2;
//ip1和ip2都是指向int型物件的指標
double dp,
*dp2;
//dp2是指向double型物件的指標,dp是double型物件
指標與引用的不同點:
1.指標本身就是乙個物件,允許對指標賦值和拷貝,而且在指標的生命週期內它可以先後指向幾個不同的物件。
2.指標無須在定義時賦初值。和其他內建型別一樣,在塊作用域內定義的指標如果沒有被初始化,也將擁有乙個不確定的值。
指標存放某個物件的位址,要想獲取該位址,需要使用取位址符(&)
int ival=42;
int*p=
&ival;
//p存放變數ival的位址,或者說p是指向變數ival的指標
所有指標的型別都要和它所指向的物件嚴格匹配
例外
(1)允許令乙個指向常量的指標指向乙個非常量物件
double dval=
3.14
;const
double
*cptr=
&dval;
//正確,但是不能通過cptr改變dval的值
(2)基類與派生類
見復合型別(1),同引用
指標的值(即位址)應屬下列4種狀態之一:
1.指向乙個物件
2.指向緊鄰物件所佔空間的下乙個位置
3.空指標,指標沒有指向任何物件
4.無效指標,上述情況之外的其他值
如果指標指向了乙個物件,則允許使用解引用符(操作符*)來訪問該物件。
int ival=42;
int*p=
&ival;
cout<<
*p;//輸出42
如果給解引用的結果賦值,實際上也就是給指標所指的物件賦值
*p=0;
//由p給變數ival賦值
cout<<
*p;//輸出0
不指向任何物件
生成空指標的方法如下:
int
*p1=
nullptr
;//等價於int *pi=0;
int*p2=0;
//直接將p2初始化為字面常量0;
//需要首先#include cstdlib
int*p3=
null
;//等價於int *p3=0;
建議:初始化所有指標,實在不清楚指向何處的,初始化為nullptr或0
int zero=0;
pi=zero;
//錯誤,不能把int變數直接賦值給指標
給指標賦值就是令它存放乙個新的位址,從而指向乙個新的物件。
int i=42;
int*pi=0;
//pi被初始化,但沒有指向任何物件
int*pi2=
&i;//pi2被初始化,存有i的位址
pi2=0;
//現在pi2不指向任何物件了
賦值,永遠改變的是等號左側的物件
pi=
&ival;
//pi的值被改變,現在pi指向了ival
*pi=0;
//ival的值被改變,指標pi並沒有改變
int ival=
1024
;int
*pi=0;
//pi合法,空指標
int*pi2=
&ival;
//pi2為合法指標,存放著ival的位址
if(pi)
//pi的值是0,因此條件的值是false
//...
if(pi2)
//pi2指向ival,因此它的值不是0,條件的值是true
//...
任何非0指標對應的條件值都是true。
兩個指標存放的位址值相同(兩個指標相等)有三種可能:
1.都為空
2.都指向同一物件
3.都指向同一物件的下一位址
乙個指標指向某物件,同時另乙個指標指向另外物件的下一位址,也可能出現指標相等。
可用於存放任意物件的位址
double obj=
3.14
,*pd=
&obj;
void
*pv=
&obj;
//obj可以是任意型別的物件
pv=pd;
//pv可以存放任意型別的指標
不能直接操作void*指標所指的物件,因為我們並不知道這個物件的型別。 c 學習筆記(1)復合型別
復合型別是指基於其他型別定義的型別。接下來介紹c 復合型別中的兩種 應用和指標。通過將宣告符寫成 d的形式來定義應用資料型別,其中d是宣告的變數名。int a 0 宣告基本資料型別 int refa a 宣告引用資料型別,refa指向a,是a的另外乙個名字 int refb 錯誤,引用必須被初始化為...
C 學習筆記 復合型別 陣列
陣列 array 宣告應指出下面三點 1 儲存在每個元素中的值的型別 2 陣列名 3 陣列的元素數 宣告陣列的通用格式如下 typename arrayname arraysize arrrysize指的是陣列的大小,不能為變數,必須為常量。c 陣列的元素可以單獨訪問,方法是使用下標或者索引進行編號...
C 學習 C 復合型別
1.引用 引用是為某乙個變數起了另乙個名字,定義方式為type rval val 引用型別必須與引用的變數型別完全一致,引用後,rval和val將會被視為乙個變數,只不過有兩種呼叫方式,改變rval的值,val的值會隨之改變,改變val的值,對rval進行呼叫時值也發生了改變。將乙個值繫結後,將無法...