C 引用與指標基礎

2021-09-26 06:45:24 字數 3057 閱讀 5919

本節**的引用為左值引用

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

其中引用必須初始化,因為定義引用時,程式把引用和它的初始值繫結到一起,而不是將初始值拷貝給引用,一旦初始化完成,引用將和它的初始值物件一直繫結到一起

int ival=1024;

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

int &refval2;//報錯,引用必須初始化

因為引用本身不是物件,因此不能定義引用的引用。

允許在一條語句中定義多個引用。

int i= 1024,i2= 2048;//i和r2都是int

int &r= i,r2= i2;//r是乙個引用,r2是int

int i3 =1024,&ri = i3;//i3是int,ri是引用

int &r3=i3,&r4=i2;//r3和r4都是引用

除兩種例外情況,一種設計const的引用,一種涉及基類子類繼承。

需要注意的是:

一般情況下,所有引用的型別都要與繫結的物件嚴格匹配,而且,一般情況下引用只能繫結到物件上,而不能與字面值或某個表示式的計算結果繫結在一起。

int &refval4=10;//錯誤,引用型別的初始值必須是乙個物件

double dval =3.14;

int &refval55 =dval;//錯誤,此處引用必須是int型物件

//特殊情況

int i=42;

const int &r1=i;

const int &r2=42;//正確,特殊情況

const int &r3=r1*2;//正確,特殊情況

在c++中,引用主要用於定義函式引數和返回值型別,因為引用只需傳遞乙個物件的位址,可提高效率。

與引用類似,指標也實現了對其他物件的間接訪問,然而指標和引用相比又有許多不同點。其一,指標本身就是乙個物件,允許複製拷貝指標,而且指標的生命週期內它可以先後指向幾個不同的物件

其二,指標無需在定義時賦初值。

指標存放某個物件的位址,要想獲取該位址,需要使用取位址符(&),注意和引用處的&意義不同。

和引用類似,除兩種特殊情況,指向常量的指標 和 基類子類問題

一般情況,所有指標的型別都要和他所指向的物件嚴格匹配

int *ip1,*1p2;//ip1和ip2都是指向int型物件的指標

double dp,*dp2;//dp2是指向double型物件的指標,dp是double型物件

double dval;

double *pd=&dval;//正確

double *pd2=pd;//正確

int *pi=pd;//錯誤,指標型別和物件型別不匹配

pi=&dval;//錯誤,不匹配

特殊情況一

double dval=3.14;

const double *cptr =&dval;//允許用指向常量指標指向乙個非常量物件

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

int ival=42;

int *p=&ival;//p是指向變數ival的指標

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

*p=0;//由符號*得到指標p所指的物件,即可由p為變數ival賦值

cout<<*p;//輸出0

空指標

不指向任何物件,在試圖使用乙個指標前**可以首先檢查他是否為空,以下列出幾個生成空指標方法

int *p1=nullptr;//等價於int *p1=0;

int *p2=0;

//需要首先#include cstdlib

int *p3=null;

void* 指標

指標支援的操作

對於兩個型別相同的合法指標,可以用相等運算子(==)或 不等運算子(!=)來比較他們,比較的結果是布林型別,如果兩個指標存放的位址值相同,則他們相等;反之他們不相等,這裡兩個指標存放的位址值相同有三種可能:它們都為空、都指向同乙個物件,或者都指向了同乙個物件的下乙個位址。需要注意,乙個指標指向某物件,同時另乙個指標指向另外物件的下乙個位址,此時也有可能出現兩個指標值相同的情況,即指標相等。 上述操作必須使用合法指標。

特別的,當指標指向陣列時,vector和string的迭代器支援的運算,陣列的指標全都支援為讓指標的使用更加簡單,更加安全,c++11標準引入了兩個名為begin和end的函式,這兩個函式與容器中的兩個同名成員功能類似,不過陣列不是類型別,這兩個函式不是成員函式,所以正確的使用形式是把陣列作為他們的引數;

int ia=;

int *beg=begin(ia);//指向ia首元素的指標

int *last =end(ia);//指向ia尾元素的下一位置的指標

這兩個函式定義在iterator標頭檔案中,注意尾後指標不能執行解引用和遞增操作

指向陣列元素的指標可以執行迭代器所支援的運算,包括解引用,遞增,比較,與整數相加,兩個指標相減。 乙個指標加上某整數值,結果仍是指標,新指標指向的元素與原來的指標相比前進了 該整數個位置,但如果計算所得的指標超出了範圍就產生錯誤,

int arr[sz]=;

int *ip=arr;//等價於int *ip=&arr[0]

int *ip2=ip+4;//ip2指向arr的尾元素arr[4]

int *ip3=arr+10;//錯誤,arr只有5個元素,p3的值未定義

和迭代器一樣,兩個指標相減的結果是它們之間的距離,型別是一種名為ptrdiff_t的標準庫型別,和size_t一樣,ptrdiff_t也是定義在cstddef標頭檔案中的機器相關的型別

,因為差值可能為負,所以它是帶符號型別

C 指標與引用

include 引用傳遞 int add1 int x,int y 指標傳遞 int add2 int x,int y 值傳遞 int add3 int x,int y void main int a 1 int b a 引用,表示b的引用指向了a 定義引用 開頭 必須賦初值 引用變數不占用記憶體 ...

C 指標與引用

從函式引數傳遞說起 int addition int x,int y int main void duplicate int a,int b int main 按值傳遞,顧名思義,函式形參僅僅得到變數傳來的值,函式的任何操作並不對變數產生任何變化 按位址傳遞,他的定義方式與按值傳遞不一樣 注意其在m...

C 引用與指標

1 引用即給當前物件起了個別名,通過將宣告符寫成 t c的形式來定義引用,其中t是變數名,c是當前物件的名字 修改別名相當於修改當前物件,引用必須初始化,且不能更改指向物件 example int a 10 定義a及初始化 int c a 定義a的引用c cout2 引用不是物件,只是對目前已經存在...