C 學習筆記 復合型別(2

2021-10-07 12:42:37 字數 2451 閱讀 5425

指標——備受折磨

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進行呼叫時值也發生了改變。將乙個值繫結後,將無法...