91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++的引用和指針

jf_78858299 ? 來(lái)源:QStack ? 作者: 月下西樓 ? 2023-03-17 14:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

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

引用

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

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

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

指針

指針是一個(gè)復(fù)合類(lèi)型指向其他的類(lèi)型,就像引用,指針也是用于間接獲取對(duì)象,但是與引用不同,指針是一個(gè)對(duì)象,它擁有對(duì)象有的能力,一個(gè)指針可以賦值和拷貝,在它的生命周期內(nèi),一個(gè)指針可以指向多個(gè)對(duì)象,且指針無(wú)需在定義時(shí)就初始化,就像其他的基本類(lèi)型,如果其范圍內(nèi)沒(mé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ì)象沒(méi)有地址,所以我嘛不會(huì)定義一個(gè)指針指向一個(gè)引用。

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

?

double dval;
double *pd = &dval; //沒(méi)問(wèn)題
double *pd2 = pd; //沒(méi)問(wèn)題

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

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

指針的值

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

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

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

指針獲取對(duì)象

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

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

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

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

空指針

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

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

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

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

?

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

未初始化的指針是一個(gè)很常見(jiàn)的運(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è)地址,而且無(wú)法分辨該地址是否有效,如果是無(wú)效地址則會(huì)crash,如果是有效地址則可能會(huì)發(fā)生未知錯(cuò)誤。 所以建議初始化所有的變量,尤其是指針,如果可能的話(huà),只在指針需要指向的對(duì)象定義后定義指針,如果實(shí)在沒(méi)有指向的對(duì)象,初始化為nullptr或0,這樣程序可以檢測(cè)到指針沒(méi)有指向一個(gè)對(duì)象。

指針與賦值

指針和引用都是提供間接訪問(wèn)對(duì)象的方法,但是二者還是有很大的差別,其中最大的差別就是引用不是一個(gè)對(duì)象,一旦我們定義了一個(gè)應(yīng)用就沒(méi)有辦法讓它指向另一個(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被初始化但是沒(méi)有指向?qū)ο?   int *pi2 = &i //pi2被初始化且地址指向i
   int *pi3; //pi3定義了但是沒(méi)有初始化
   pi3 = pi2; //pi2和pi3指向同一個(gè)對(duì)象
   pi2 = 0; //pi2不指向任何對(duì)象

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

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

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

*pi = 0;

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

?

理解復(fù)合類(lèi)型

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

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

定義多個(gè)變量

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

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

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

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

指向指針的指針

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

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

指針的引用

由于引用不是一個(gè)對(duì)象,所以沒(méi)有指向引用的指針,但是指針是一個(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
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7335

    瀏覽量

    94763
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    484

    瀏覽量

    71845
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2124

    瀏覽量

    77112
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C指針_CC++經(jīng)典著作

    C指針_CC++經(jīng)典著作,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-16 18:32 ?0次下載

    C++實(shí)驗(yàn)--指針

    C++實(shí)驗(yàn)--指針
    發(fā)表于 12-30 14:50 ?1次下載

    C++指針”學(xué)習(xí)建議

    C++指針”學(xué)習(xí)建議
    發(fā)表于 03-31 15:53 ?3次下載

    c引用指針的區(qū)別

    指針引用的定義 在深入介紹之前我們首先來(lái)看一下指針引用的定義、指針引用的區(qū)別,然后分別針對(duì)
    發(fā)表于 09-27 15:19 ?1次下載
    <b class='flag-5'>c</b><b class='flag-5'>引用</b>和<b class='flag-5'>指針</b>的區(qū)別

    C++指針引用的區(qū)別

    指針指針是一個(gè)變量,只不過(guò)這個(gè)變量存儲(chǔ)的是一個(gè)地址,指向內(nèi)存的一個(gè)存儲(chǔ)單元;而引用跟原來(lái)的變量實(shí)質(zhì)上是同一個(gè)東西,只不過(guò)是原變量的一個(gè)別名而已。上面定義了一個(gè)整形變量和一個(gè)指針變量p
    發(fā)表于 11-29 17:24 ?8496次閱讀

    如何從C轉(zhuǎn)向C++ Effective C++ PDF中文版教材免費(fèi)下載

    對(duì)每個(gè)人來(lái)說(shuō),習(xí)慣 C++需要一些時(shí)間,對(duì)于已經(jīng)熟悉C 的程序員來(lái)說(shuō),這個(gè)過(guò)程尤其令人苦惱。因?yàn)?b class='flag-5'>C 是C++的子集,所有的C 的技術(shù)都可以繼
    發(fā)表于 01-10 16:48 ?0次下載

    C++程序設(shè)計(jì)教程之指針的詳細(xì)資料說(shuō)明

    本文檔詳細(xì)介紹的是C++程序設(shè)計(jì)教程之指針的詳細(xì)資料說(shuō)明主要內(nèi)容包括了:1. 指針的概念,2. 變量與指針,3. 數(shù)組與指針,4. 字符串與
    發(fā)表于 03-14 16:04 ?7次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之<b class='flag-5'>指針</b>的詳細(xì)資料說(shuō)明

    C++指針的學(xué)習(xí)建議

     一。對(duì)于眾多人提出的c/c++指針難學(xué)的問(wèn)題做個(gè)總結(jié):
    發(fā)表于 11-07 17:13 ?8次下載
    <b class='flag-5'>C++</b><b class='flag-5'>指針</b>的學(xué)習(xí)建議

    C++封裝:this指針

    C++封裝:this指針
    的頭像 發(fā)表于 06-29 14:37 ?4129次閱讀
    <b class='flag-5'>C++</b>封裝:this<b class='flag-5'>指針</b>

    C++指針引用的區(qū)別與聯(lián)系

    指針指針是一個(gè)變量,只不過(guò)這個(gè)變量存儲(chǔ)的是一個(gè)地址,指向內(nèi)存的一個(gè)存儲(chǔ)單元。引用引用跟原來(lái)的變量實(shí)質(zhì)上是同一個(gè)東西,只不過(guò)是原變量的一個(gè)別名而已。
    的頭像 發(fā)表于 06-29 15:05 ?5821次閱讀
    <b class='flag-5'>C++</b>:<b class='flag-5'>指針</b>和<b class='flag-5'>引用</b>的區(qū)別與聯(lián)系

    C++:常引用的概念和作用

    int &a=b 相當(dāng)于 int const a=b。即引用是一個(gè)指針常量(又稱(chēng)常指針,即一個(gè)常量,其類(lèi)型是指針)。 每當(dāng)編譯器遇到引用變量
    的頭像 發(fā)表于 06-29 15:08 ?1.3w次閱讀
    <b class='flag-5'>C++</b>:常<b class='flag-5'>引用</b>的概念和作用

    C++引用的使用場(chǎng)景

    C++引用的使用場(chǎng)景
    的頭像 發(fā)表于 06-29 15:18 ?4761次閱讀
    <b class='flag-5'>C++</b>:<b class='flag-5'>引用</b>的使用場(chǎng)景

    C++中的const和引用的討論

    今天給大家分享一下這段時(shí)間學(xué)習(xí)c++的總結(jié)學(xué)習(xí):c++里面的const關(guān)鍵字和引用
    的頭像 發(fā)表于 12-24 15:35 ?1442次閱讀

    CC++經(jīng)典著作《C指針

    CC++經(jīng)典著作《C指針
    發(fā)表于 01-17 09:46 ?0次下載

    C語(yǔ)言 / C++基礎(chǔ)面試知識(shí)大集合

    點(diǎn)擊上方名片關(guān)注我們C語(yǔ)言和C++相關(guān)的面試題一直比較少見(jiàn)一些,沒(méi)有Java方向?qū)懙娜四敲炊?,這是一篇C語(yǔ)言與C++面試知識(shí)點(diǎn)總結(jié)的文章,非常難得。const作用修飾變量,說(shuō)明該變量不
    的頭像 發(fā)表于 05-26 10:38 ?1997次閱讀
    <b class='flag-5'>C</b>語(yǔ)言 / <b class='flag-5'>C++</b>基礎(chǔ)面試知識(shí)大集合