2017 11 11 復合型別

2022-08-23 22:03:10 字數 2986 閱讀 7445

2.3 復合型別

2.3.1 引用

引用就是為物件起了個別名,引用型別引用另外一種型別。通過將宣告符寫成&d的形式來定義引用型別,其中d是宣告的變數名。

int ival =1024;

int &refval= ival;          // refval 指向ival (是ival 的另乙個名字)

2.3.2 指標

指標是「指向」另外一種型別的復合型別。與引用不同,第一,指標本身就是乙個物件,允許對指標賦值和拷貝,而且在指標生命週期內它可以先後指向幾個不同的物件。其二,指標無須在定義時賦值。在塊作用域內定義的指標如果沒有被初始化,也將擁有乙個不確定的值。

定義指標型別的方法將宣告符寫成*d的形式,其中d是變數名。

獲取物件的位址

指標存放某個物件的位址,想要獲取該位址,需要使用取位址符&。

int ival= 42;

int *p = &ival;          // p存放變數ival的位址,或者說p是指向變數ival 的指標

指標值指標的值應屬於下列4種狀態之一:

1.指向乙個物件。

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

3.空指標,意味著指標沒有指向任何物件。

4.無效指標,也就是上述情況之外的其他值。

利指標訪問物件

如果指標指向了乙個物件,則允許使用解引用符(*)來訪問該物件;

int ival = 42;

int *p= &ival;               //p存放變數ival的位址

std::cout<<*p;            //由符號*得到指標p所指的物件,輸出42.

對指標的解引用會得出所指物件,因此如果給解引用的結果賦值,實際上也就是給指標所指的物件賦值;

*p=0;

cout<<*p;  //輸出0

空指標空指標不指向任何物件,以下列出生成空指標的方法;

int *p = nullptr;

int *p = 0;

int *p = null;          //需要首先#include

void*     指標

void* 是一種特殊的指標型別,可用於存放任意物件的位址。

double obj = 3.14 , *pd= &obj;

void *pv=&obj;

pv=pd;

利用void* 指標能做的事比較有限:拿他和別的指標比較、作為函式的輸入或輸出,或者賦給另乙個void*指標。

指向指標的指標

**表示指向指標的指標,***表示指向指標的指標的指標。

int ival=1024;

int *pi=&ival;

int **ppi=π

2.4 const 限定符

const 可以讓變數的值,保持不變。

const int bufsize = 512;

某些時候有這樣一種const變數,它的初始值不是乙個常量表示式,但又確實有必要在檔案之間共享。這種情況下,我們不希望編譯器為每個檔案分別生成獨立的變數。相反,我們想讓這類const 物件像其他物件一樣工作,也就是說,只在乙個檔案中定義const,而在其他多個檔案中宣告並使用它。

解決辦法是,對於const 變數不管是宣告還是定義都新增extern 關鍵字,這樣只需定義一次就可以了:

// file_1.cc 定義並初始化了乙個常量,該常量能被其檔案訪問

extern const int bufsize = fcn();

//file_1.h 標頭檔案

extern const int bufsize;

file_1.cc 定義並初始化bufsize。因為這條語句包含了初始值,所以它是一次定義。然而,因為bufsize 是乙個常量,必須用extern 加以限定使其被其他檔案使用。

file_1.h 標頭檔案中的宣告也由extern做了限定,其作用是指明bufsize 並非本檔案獨有,它的定義將在別處出現。

用頂層const 表示指標本身是乙個常量,而用名詞底層 const 表示指標所指的物件是乙個常量。

int i = 0;

int *const p1 = &i;          // 不能改變p1的值,這是乙個頂層的const

const int ci = 42;          //不能改變ci的值,這是乙個頂層const

const int *p2 = &ci;           //允許改變p2的值,這是乙個底層const

const int *const p3 = p2;      // 靠右的const 是頂層const,靠左的是底層const

const int &r = ci;               //用於宣告引用的const 都是底層const

constexpr 變數          

允許將變數宣告為constexpr型別以便由編譯器來驗證變數的值是否是乙個常量表示式。

constexpr  int mf = 20;

constexpr int limit = mf +1;

constexpr int sz = size();

2.5 處理型別

2.5.1 型別別名

typedef double wages;             //wages 是double 的同義詞

typedef wages base,*p;           //base是double的同義詞,p是double *的同義詞

新的宣告方法

using si = sale_item;              //si是sale_item 的同義詞

2.5.2  auto 型別說明符

auto 讓編譯器通過初始值來推算變數的型別。

2.5.3 decltype 型別指示符

有時會遇到這種情況:希望從表示式的型別推斷出要定義的變數的型別,但是不想用該表示式的值初始化變數。decltype 的作用是選擇並返回運算元的資料型別。

decltype(f()) sum = x;            // sum的型別就是函式f的返回型別

python復合型別 python復合型別

鏈結 list python的列表的特點 可以隨時新增和刪除元素 可以做的操作有 切片,新增,刪除,查詢,修改,排序 列表元素可以是不同型別,在型別不同的情況下就無法排序 列表是有序的 定義小馬列表 li twilight pinkiepie rainbow dash 插入 insert self ...

復合型別資料

1 記錄型別 自定義record型別 declare type example record type is record name emp.ename type,salary emp.salary type,dno emp.deptno type 宣告record型別變數 example reco...

C 復合型別

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