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不是變數,變數的...