C 學習 C 復合型別

2022-09-03 00:57:11 字數 2388 閱讀 2022

1.引用

引用是為某乙個變數起了另乙個名字,定義方式為type &rval = val;

引用型別必須與引用的變數型別完全一致,引用後,rval和val將會被視為乙個變數,只不過有兩種呼叫方式,改變rval的值,val的值會隨之改變,改變val的值,對rval進行呼叫時值也發生了改變。將乙個值繫結後,將無法繫結其他變數。引用並不是物件,這決定了在定義引用時,等號的右邊不能為引用,即不能定義引用的引用。

尤為重要的是,引用必須要初始化,否則語句就是非法的。

當引用牽涉到const限定符的時候會變得非常有趣。const type &rval=val,這個表示式的右邊現在可以賦值為字面值常量了,同時也可以被賦值以變數,但普通的引用型別是無法引用字面值常量的。同時它的型別不那麼受拘束了,如在之前的定義中,

double d = 3.14;

int &ri = d;

這樣的**是不被編譯器接受的,因為對乙個整型引用來說,double 型別的d變數是不合法的,但是加入了const限定符之後

double d = 3.14;

const int &ri = d;

這樣的**就是合法的,並且ri的值為3。

發生這種情況的原因是,當ri引用時,期望得到的是乙個整型常量,然而d是乙個雙精度浮點數,為了讓ri繫結它,編譯器在編譯過程中引入了這樣的過程

const int temp = d;

const int &ri = temp;

這樣一來,d先由雙精度浮點數轉換為整型常量temp,然後讓ri來繫結temp,就變得合法了。

2.指標

指標是公認c語言最精髓的部分,也被c++語言繼承而來,與它的精髓所匹配的就是它的難度。指標與引用類似,同樣是指向乙個變數,但不同的是,指標指向變數後可以隨意變更所指物件,也可以通過指標訪問物件,但通過物件並不能對指標產生改變,同時指標自身也是乙個物件,這就決定了定義指標時,等號右邊是可以為指標的,即我們可以定義指標的指標。指標在定義時並不一定要賦初值,如果是在函式體內定義,不賦初值會產生乙個不確定的量,為防止指標指向奇怪的地方因而導致程式崩潰,在定義指標時賦值或者讓其指向空是很必要的手段。

指標定義形式如下: type *ptr = &val;

關於*和&符號在程式中的作用有必要予以說明:

*是解引用符,如p是指向物件a的乙個指標,此時想要通過指標p訪問a,則需要使用*p解除p的引用,即指向a。&是乙個取位址符,對變數a,取a的位址用&來表示。同時它們又可以用來定義引用或指標,因此以下**可以幫助理解:

int i = 42;

int &r = i;             //&緊隨型別名出現,因此是宣告的一部分,r是乙個引用

int *p;                 //*緊隨型別名出現,因此是宣告的一部分,p是乙個指標

p = &i;                 //&出現在表示式中,是乙個取位址符

*p = i;                 //*出現在表示式中,是乙個解引用符

int &r2 = *p;       //&是宣告的一部分,*是乙個解引用符

乙個指標的值應為以下四種狀態之一:

1.指向乙個物件

2.指向緊鄰物件所佔空間的下乙個位置

3.空指標,即不指向任何物件

4.無效指標,即除以上三種情況的指標

空指標是指標比較重要的乙個狀態,空指標即指標當前不指向任何物件,在定義指標時,如果不清楚指標應當指向何處,可以將其指向空。將乙個指標指向空有三種方法:

*ptr = nullptr;

*ptr = 0;//需要cstdlib庫的支援

*ptr = null

這三種方法均可以將指標指向空,但同時又有所不同。*ptr = nullptr;是c++11新標準中引入的一種方法,nullptr是乙個較為特殊的字面值,它可以被轉換成任意其他指標型別;*ptr = 0;即將指標初始化為字面值0來得到空指標。null則是過去經常用的一種預處理變數(預處理變數不屬於std命名空間,歸預處理器官,因此在呼叫null時不需要加std::)現在的程式最好用nullptr來得到空指標。

c++primer中建議所有指標都必須進行初始化,否則容易引起程式崩潰。

由於指標賦值是乙個及其讓人腦熱的操作,因此謹記一點:被賦值的即是等號左邊的部分。

指標同樣可以用作布林表示式。

if(p)…即表示如果指標p指向空則返回false,不為空則返回true.

void*指標

void 指標可以存放任意型別的指標,它可以:和別的指標進行比較;作為函式輸入或輸出;賦值給另外乙個void*指標。並不能對void*指標指向的物件進行操作,因為我們並不清楚它到底是什麼型別的。

C 復合型別

陣列 陣列是一種資料格式,能夠儲存多個同型別的資料。宣告陣列的通用格式 typename arrayname arraysize arraysize指定了元素的個數,它必須是整型常量 20或者const值 也可以是表示式,但是其中的所有值在編譯時必須是已知的,所以說arraysize不是變數,變數的...

C 復合型別

include include include include include using namespace std 學習進度c primer plus第4章 復合型別 陣列 c風格字串 string變數 getline 和get 結構體 共用體 列舉 指標 new與delete管理動態記憶體 建...

C 復合型別

復合型別 基於其它型別定義的型別。1.引用 reference 含義 物件的另外的名字,引用另外一種型別,使用 宣告符 的形式定義。引用即別名,引用不是乙個物件,只是已經存在的物件的另外乙個名字,因此定義引用必須初始化,且不能定義引用的引用。一般初始化變數,是將初始值拷貝到新物件中去,而定義引用時,...