最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++入門教程之引用與指針

 更新時(shí)間:2022年12月13日 09:40:37   作者:月下西樓  
初學(xué)C++時(shí),很容易把指針和引用的用法混在一起,下面這篇文章主要給大家介紹了關(guān)于C++入門教程之引用與指針的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

之前的文章我們已經(jīng)介紹了C++中的基本類型如int,bool和double等,除了基本類型C++還有一些更復(fù)雜的數(shù)據(jù)類型復(fù)合類型,所謂的復(fù)合類型就是通過其他類型定義的類型,本篇文章我們將會(huì)著重介紹C++的復(fù)合類型引用和指針。

引用

一個(gè)引用是定義一個(gè)對(duì)象的別稱,一個(gè)引用類型是指向其他類型的,下面就是引用聲明的例子。

int val = 1024;
int &refVal = val; //refVal指向val
int &refVal2; //錯(cuò)誤,引用必須初始化

通常來說,當(dāng)我們初始化一個(gè)變量,初始化的值就會(huì)拷貝進(jìn)我們創(chuàng)建的對(duì)象,當(dāng)創(chuàng)建一個(gè)引用時(shí),不是拷貝初始化的值,而是將引用與初始化的對(duì)象綁定,一旦初始化,一個(gè)引用就是保持與初始化對(duì)象的綁定,且無法重新綁定,所以引用必須要初始化。

指針

指針是一個(gè)復(fù)合類型指向其他的類型,就像引用,指針也是用于間接獲取對(duì)象,但是與引用不同,指針是一個(gè)對(duì)象,它擁有對(duì)象有的能力,一個(gè)指針可以賦值和拷貝,在它的生命周期內(nèi),一個(gè)指針可以指向多個(gè)對(duì)象,且指針無需在定義時(shí)就初始化,就像其他的基本類型,如果其范圍內(nèi)沒有初始化會(huì)有一個(gè)默認(rèn)值,以下就是指針的聲明,*是指針操作符。

int *p1, *p2;
double dp, *dp2;

指針與地址

一個(gè)指針持有一個(gè)對(duì)象的地址,可以同地址操作符(&)獲取地址。

int val = 42;
int *p = &val;

上面的例子中,第二個(gè)表達(dá)式定義了一個(gè)int指針p,且初始化p指向一個(gè)叫做val的int對(duì)象,因?yàn)橐貌皇菍?duì)象沒有地址,所以我嘛不會(huì)定義一個(gè)指針指向一個(gè)引用。

需要注意的是指針的類型要與指向?qū)ο蟮念愋拖嗤?,否則就會(huì)發(fā)生錯(cuò)誤

double dval;
double *pd = &dval; //沒問題
double *pd2 = pd; //沒問題

int *pi = pd; //報(bào)錯(cuò), pi與pd類型不一致

以上例子就睡報(bào)錯(cuò)不能用int *類型初始化double , 可以將與基本類型的組合理解為一個(gè)新的類型。類型必須匹配,因?yàn)樾枰ㄟ^指針的類型來推斷指針指向?qū)ο蟮念愋?,正如之前所提到的,一個(gè)對(duì)象的類型決定了其所支持的操作,如果類型不一致會(huì)導(dǎo)致操作失敗。

指針的值

指針的值(地址)有以下四種情況

  • 指向一個(gè)對(duì)象
  • 指向緊鄰對(duì)象所占空間的下一個(gè)位置
  • 空指針,意味著未指向任何對(duì)象
  • 無效指針,也就是上述情況之外的值

拷貝和獲取一個(gè)無效指針會(huì)引發(fā)錯(cuò)誤,編譯器并不負(fù)責(zé)檢查此類錯(cuò)誤,訪問無效執(zhí)政的后果是無法預(yù)計(jì)的,所以程序員必須要清楚的知道所給指針是否有效。雖然第2和第三種情況指針是有效的,但是使用上還是有很多限制,因?yàn)樗鼈儾]有指向一個(gè)對(duì)象,如果我們通過它們獲取對(duì)象,其結(jié)果也是未知的。

指針獲取對(duì)象

當(dāng)一個(gè)指針指向一個(gè)對(duì)象時(shí),我們可以通過解引用操作符*來獲取對(duì)象

int val = 42;
int* p = &val;  //p持有val的地址,p是指向val的指針
std::cout<<*p;  //*p獲取p指向的對(duì)象

一些符號(hào)如和&在表達(dá)式和聲明中都會(huì)使用到,其中符號(hào)所處的上下文決定其含義,在聲明中,&和是用于形成復(fù)合類型,在表達(dá)式中這些符號(hào)代表一種操作,雖然是相同的符號(hào)但是含義完全不同,最好好的方法就是忽略它們的表象,將其視為不同的符號(hào),以下例子中就詳細(xì)說明了兩種符號(hào)不同場(chǎng)景下的不同含義。

int val = 42;
int &r = val; //&在類型的后面是聲明的一部分,r是一個(gè)引用
int *p;  //*在類型的后面是聲明的一部分,p是一個(gè)指針
p = &val; //&在表達(dá)式中,所以是取地址操作符
*p = val; // *在表達(dá)式中,是解引用操作符
int &r2 = *p; //&是聲明的一部分,*是解引用操作符

空指針

空指針沒有指向任何對(duì)象,在使用一個(gè)指針前可以先檢查其是否為空,獲得空指針的方式有以下幾種:

int *p1 = nullptr; //等價(jià)于int *p1 = 0
int *p2 = 0; //直接通過字面量0來初始化
int *p3 = NULL; //等價(jià)于int *p3 = 0

最直接的方法獲取空指針就是nullptr,這也是新標(biāo)準(zhǔn)引進(jìn)的方法,也可以通過字面量0來初始化指針,在一些老的程序中會(huì)使用預(yù)處理變量NULL,在cstlib頭文件中將其定義為0,至于預(yù)處理器的內(nèi)容之后會(huì)詳細(xì)介紹。

需要注意將一個(gè)int值賦予一個(gè)指針是不合法的,即使是0也不行

int zero = 0;
pi = 0 //錯(cuò)誤

未初始化的指針是一個(gè)很常見的運(yùn)行時(shí)錯(cuò)誤,正如使用其他未初始化的變量一樣,使用一個(gè)未初始化的指針結(jié)果也是未知的,絕大多數(shù)情況使用未初始化的指針會(huì)導(dǎo)致運(yùn)crash,而且在debug時(shí)很困難。 在大多數(shù)的編譯器中,如果使用一個(gè)未初始化的指針,內(nèi)存中該指針存儲(chǔ)的內(nèi)容會(huì)被當(dāng)作一個(gè)地址,而且無法分辨該地址是否有效,如果是無效地址則會(huì)crash,如果是有效地址則可能會(huì)發(fā)生未知錯(cuò)誤。 所以建議初始化所有的變量,尤其是指針,如果可能的話,只在指針需要指向的對(duì)象定義后定義指針,如果實(shí)在沒有指向的對(duì)象,初始化為nullptr或0,這樣程序可以檢測(cè)到指針沒有指向一個(gè)對(duì)象。

指針與賦值

指針和引用都是提供間接訪問對(duì)象的方法,但是二者還是有很大的差別,其中最大的差別就是引用不是一個(gè)對(duì)象,一旦我們定義了一個(gè)應(yīng)用就沒有辦法讓它指向另一個(gè)對(duì)象,當(dāng)我們使用引用的時(shí)候我們只會(huì)獲得其最初綁定的對(duì)象。指針和其持有的地址之間的關(guān)系并不保證,當(dāng)我們給一個(gè)指針賦值一個(gè)非引用對(duì)象時(shí),將會(huì)給指針自身一個(gè)新的值。賦值讓指針指向一個(gè)不同的對(duì)象。

   int i = 0;
   int *pi = 0; //pi被初始化但是沒有指向?qū)ο?
   int *pi2 = &i //pi2被初始化且地址指向i
   int *pi3; //pi3定義了但是沒有初始化
   pi3 = pi2; //pi2和pi3指向同一個(gè)對(duì)象
   pi2 = 0; //pi2不指向任何對(duì)象

有時(shí)候很難直接看出來賦值是改變了指針還是改變了指針指向的對(duì)象,最重要就是記住賦值改變左邊的操作數(shù),例子如下,我們給pi賦值改變的是pi持有的地址。

pi = &ival; //pi的值改變,現(xiàn)在pi指向ival

與此同時(shí),以下例子是*pi(pi指向的值)改變了

*pi = 0;

void*是一個(gè)特殊的指針類型,其可以持有任何類型的對(duì)象的地址,

理解復(fù)合類型

正如我們所看到的,一個(gè)變量定義包含了一個(gè)基本類型和一系列的聲明符,每一個(gè)聲明符與其相關(guān)的基本類型變量關(guān)聯(lián),且與其他在同一個(gè)定義里的聲明符無關(guān),所以一個(gè)定義可以定義多個(gè)不用類型的變量,例子如下

int i = 1024, *p = &1; &r = i;

定義多個(gè)變量

在之前的例子中很容易認(rèn)為*和&作用于一個(gè)聲明語句的所有對(duì)象,其很大一個(gè)原因是我們可以將修飾符與變量名分開如下

int* p; //合法但是很容易造成誤解

int* p1, p2; //p1是一個(gè)指針,p2是一個(gè)整型

int *p1, *p2; //p1, p2都是指向整型的指針

指向指針的指針

通常來說,對(duì)于一個(gè)聲明符來說修飾符的數(shù)量并沒有限制,但有超過一個(gè)的修飾符時(shí)雖然符合邏輯,但是卻不總是很明晰,例如考慮一個(gè)指針,一個(gè)指針是內(nèi)存中的一個(gè)對(duì)象,所以我們可以將一個(gè)指針的地址存儲(chǔ)在一個(gè)指針中。

int ival = 1024;
int *pi = &ival; //pi指向一個(gè)整型
int **ppi = &pi; //ppi指向一個(gè)整型指針

指針的引用

由于引用不是一個(gè)對(duì)象,所以沒有指向引用的指針,但是指針是一個(gè)對(duì)象,所以有指向指針的引用

int i = 42;
int *p1; //pi是一個(gè)整型指針
int *&r = p; //r是p的一個(gè)引用
r = &i; //r是p的引用,所以等同于p = &i
*r = 0; //將i的值設(shè)置為0

最后

到此這篇關(guān)于C++入門教程之引用與指針的文章就介紹到這了,更多相關(guān)C++引用與指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++智能指針詳解

    C++智能指針詳解

    從比較簡單的層面來看,智能指針是RAII(Resource Acquisition Is Initialization,資源獲取即初始化)機(jī)制對(duì)普通指針進(jìn)行的一層封裝。這樣使得智能指針的行為動(dòng)作像一個(gè)指針,本質(zhì)上卻是一個(gè)對(duì)象,這樣可以方便管理一個(gè)對(duì)象的生命周期
    2022-08-08
  • C語言實(shí)現(xiàn)自動(dòng)給QQ好友發(fā)窗口抖動(dòng)

    C語言實(shí)現(xiàn)自動(dòng)給QQ好友發(fā)窗口抖動(dòng)

    這篇文章主要介紹了C語言實(shí)現(xiàn)自動(dòng)給QQ好友發(fā)窗口抖動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C++基本算法思想之遞推算法思想

    C++基本算法思想之遞推算法思想

    遞推算法需要用戶知道答案和問題之間的邏輯關(guān)系。在許多數(shù)學(xué)問題中,都有明確的計(jì)算公式可以遵循,因此可以采用遞推算法來實(shí)現(xiàn)
    2013-10-10
  • C++基礎(chǔ)學(xué)生管理系統(tǒng)

    C++基礎(chǔ)學(xué)生管理系統(tǒng)

    這篇文章主要介紹了C++基礎(chǔ)學(xué)生管理系統(tǒng)的相關(guān)資料,包括了文件處理代碼,鏈表處理代碼,以及自定義代碼,主函數(shù)自定義,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 如何在C語言中判斷socket是否已經(jīng)斷開

    如何在C語言中判斷socket是否已經(jīng)斷開

    如果不主動(dòng)關(guān)閉socket的話,系統(tǒng)不會(huì)自動(dòng)關(guān)閉的,除非當(dāng)前進(jìn)程掛掉了,操作系統(tǒng)把占用的socket回收了才會(huì)關(guān)閉。小編今天跟大家簡單介紹下如何在C語言中判斷socket是否已經(jīng)斷開
    2019-05-05
  • OpenCV實(shí)現(xiàn)圖像切割功能

    OpenCV實(shí)現(xiàn)圖像切割功能

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像切割功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++中String的語法及常用接口的底層實(shí)現(xiàn)詳解

    C++中String的語法及常用接口的底層實(shí)現(xiàn)詳解

    在C語言中,string是一個(gè)標(biāo)準(zhǔn)庫類(class),用于處理字符串,它提供了一種更高級(jí)、更便捷的字符串操作方式,string 類提供了一系列成員函數(shù)和重載運(yùn)算符,以便于對(duì)字符串進(jìn)行操作和處理,本編文章會(huì)對(duì)C++中的 string 進(jìn)行詳解,希望本篇文章會(huì)對(duì)你有所幫助
    2023-06-06
  • C/C++ memset方法的誤區(qū)

    C/C++ memset方法的誤區(qū)

    memset 作為對(duì)內(nèi)存初始化的函數(shù),還是有不少坑和誤區(qū)的,今天就來對(duì)這個(gè)函數(shù)作一個(gè)總結(jié)。避免后期使用不當(dāng)踩入坑,需要的朋友可以參考下
    2021-04-04
  • 重構(gòu)-C++實(shí)現(xiàn)矩陣的簡單實(shí)例

    重構(gòu)-C++實(shí)現(xiàn)矩陣的簡單實(shí)例

    下面小編就為大家?guī)硪黄貥?gòu)-C++實(shí)現(xiàn)矩陣的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • 淺析C++ 數(shù)據(jù)類型

    淺析C++ 數(shù)據(jù)類型

    這篇文章主要介紹了C++ 數(shù)據(jù)類型的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論

阿拉善左旗| 攀枝花市| 水城县| 图木舒克市| 边坝县| 巴中市| 田东县| 崇义县| 关岭| 化德县| 涿州市| 柳林县| 衡水市| 长兴县| 麦盖提县| 汉沽区| 贵阳市| 庆元县| 广河县| 黄龙县| 贵溪市| 清水县| 洱源县| 冀州市| 万载县| 嘉义市| 杭锦旗| 临清市| 南汇区| 泸溪县| 宜良县| 朝阳市| 石台县| 潼南县| 阿克苏市| 措勤县| 安溪县| 普格县| 明水县| 樟树市| 阜宁县|