色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++的引用和指針

jf_78858299 ? 來源:QStack ? 作者: 月下西樓 ? 2023-03-17 14:00 ? 次閱讀

前言

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

引用

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

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

通常來說,當我們初始化一個變量,初始化的值就會拷貝進我們創建的對象,當創建一個引用時,不是拷貝初始化的值,而是將引用與初始化的對象綁定,一旦初始化,一個引用就是保持與初始化對象的綁定,且無法重新綁定,所以引用必須要初始化。

指針

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

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

指針與地址

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

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

上面的例子中,第二個表達式定義了一個int指針p,且初始化p指向一個叫做val的int對象,因為引用不是對象沒有地址,所以我嘛不會定義一個指針指向一個引用。

?需要注意的是指針的類型要與指向對象的類型相同,否則就會發生錯誤

?

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

int *pi = pd; //報錯, pi與pd類型不一致

以上例子就睡報錯不能用int *類型初始化double , 可以將與基本類型的組合理解為一個新的類型。類型必須匹配,因為需要通過指針的類型來推斷指針指向對象的類型,正如之前所提到的,一個對象的類型決定了其所支持的操作,如果類型不一致會導致操作失敗。

指針的值

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

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

拷貝和獲取一個無效指針會引發錯誤,編譯器并不負責檢查此類錯誤,訪問無效執政的后果是無法預計的,所以程序員必須要清楚的知道所給指針是否有效。雖然第2和第三種情況指針是有效的,但是使用上還是有很多限制,因為它們并沒有指向一個對象,如果我們通過它們獲取對象,其結果也是未知的。

指針獲取對象

當一個指針指向一個對象時,我們可以通過解引用操作符*來獲取對象

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

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

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

空指針

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

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

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

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

?

int zero = 0;
pi = 0 //錯誤

未初始化的指針是一個很常見的運行時錯誤,正如使用其他未初始化的變量一樣,使用一個未初始化的指針結果也是未知的,絕大多數情況使用未初始化的指針會導致運crash,而且在debug時很困難。 在大多數的編譯器中,如果使用一個未初始化的指針,內存中該指針存儲的內容會被當作一個地址,而且無法分辨該地址是否有效,如果是無效地址則會crash,如果是有效地址則可能會發生未知錯誤。 所以建議初始化所有的變量,尤其是指針,如果可能的話,只在指針需要指向的對象定義后定義指針,如果實在沒有指向的對象,初始化為nullptr或0,這樣程序可以檢測到指針沒有指向一個對象。

指針與賦值

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

int i = 0;
   int *pi = 0; //pi被初始化但是沒有指向對象
   int *pi2 = &i //pi2被初始化且地址指向i
   int *pi3; //pi3定義了但是沒有初始化
   pi3 = pi2; //pi2和pi3指向同一個對象
   pi2 = 0; //pi2不指向任何對象

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

pi = &ival; //pi的值改變,現在pi指向ival

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

*pi = 0;

?void*是一個特殊的指針類型,其可以持有任何類型的對象的地址,

?

理解復合類型

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

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

定義多個變量

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

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

int* p1, p2; //p1是一個指針,p2是一個整型

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

指向指針的指針

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

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

指針的引用

由于引用不是一個對象,所以沒有指向引用的指針,但是指針是一個對象,所以有指向指針的引用

int i = 42;
int *p1; //pi是一個整型指針
int *&r = p; //r是p的一個引用
r = &i; //r是p的引用,所以等同于p = &i
*r = 0; //將i的值設置為0
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7081

    瀏覽量

    89195
  • 指針
    +關注

    關注

    1

    文章

    480

    瀏覽量

    70582
  • C++
    C++
    +關注

    關注

    22

    文章

    2112

    瀏覽量

    73707
收藏 人收藏

    評論

    相關推薦

    C指針_CC++經典著作

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

    C++實驗--指針

    C++實驗--指針
    發表于 12-30 14:50 ?1次下載

    C++指針”學習建議

    C++指針”學習建議
    發表于 03-31 15:53 ?3次下載

    c引用指針的區別

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

    C++指針引用的區別

    指針指針是一個變量,只不過這個變量存儲的是一個地址,指向內存的一個存儲單元;而引用跟原來的變量實質上是同一個東西,只不過是原變量的一個別名而已。上面定義了一個整形變量和一個指針變量p
    發表于 11-29 17:24 ?2419次閱讀

    如何從C轉向C++ Effective C++ PDF中文版教材免費下載

    對每個人來說,習慣 C++需要一些時間,對于已經熟悉C 的程序員來說,這個過程尤其令人苦惱。因為CC++的子集,所有的C 的技術都可以繼
    發表于 01-10 16:48 ?0次下載

    C++程序設計教程之指針的詳細資料說明

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

    C++指針的學習建議

     一。對于眾多人提出的c/c++指針難學的問題做個總結:
    發表于 11-07 17:13 ?8次下載
    <b class='flag-5'>C++</b><b class='flag-5'>指針</b>的學習建議

    C++封裝:this指針

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

    C++指針引用的區別與聯系

    指針指針是一個變量,只不過這個變量存儲的是一個地址,指向內存的一個存儲單元。引用引用跟原來的變量實質上是同一個東西,只不過是原變量的一個別名而已。
    的頭像 發表于 06-29 15:05 ?5348次閱讀
    <b class='flag-5'>C++</b>:<b class='flag-5'>指針</b>和<b class='flag-5'>引用</b>的區別與聯系

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

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

    C++引用的使用場景

    C++引用的使用場景
    的頭像 發表于 06-29 15:18 ?4078次閱讀
    <b class='flag-5'>C++</b>:<b class='flag-5'>引用</b>的使用場景

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

    今天給大家分享一下這段時間學習c++的總結學習:c++里面的const關鍵字和引用
    的頭像 發表于 12-24 15:35 ?862次閱讀

    CC++經典著作《C指針

    CC++經典著作《C指針
    發表于 01-17 09:46 ?0次下載

    C語言 / C++基礎面試知識大集合

    點擊上方名片關注我們C語言和C++相關的面試題一直比較少見一些,沒有Java方向寫的人那么多,這是一篇C語言與C++面試知識點總結的文章,非常難得。const作用修飾變量,說明該變量不
    的頭像 發表于 05-26 10:38 ?925次閱讀
    <b class='flag-5'>C</b>語言 / <b class='flag-5'>C++</b>基礎面試知識大集合
    主站蜘蛛池模板: 一本道高清不卡v免费费| 乳女教师欲乱动漫无修版动画| 久久久无码精品一区二区三区| 色婷婷国产麻豆AV| 99久久免费看少妇高潮A片| 精品免费久久久久久影院| 偷柏自拍亚洲综合在线| bbwvideoa欧美老妇| 另类重口bdsm日本tv| 亚洲日韩乱码人人爽人人澡人| 大伊人青草狠狠久久| 免费A级毛片无码鲁大师| 樱花草在线观看影院| 饥渴的40岁熟妇完整版在线| 幸福草电视剧演员表介绍 | 暖暖视频免费观看高清完整版| 亚洲中文久久久久久国产精品| 光棍天堂在线a| 视频一区国产第一页| 攻把受做哭边走边肉楼梯PLAY| 欧美性喷潮xxxx| a毛片基地免费全部视频| 欧美 国产 日产 韩国 在线| 91福利在线观看| 蜜芽资源高清在线观看| 97SE亚洲国产综合在线| 嫩B人妻精品一区二区三区| 99精品免费久久久久久久久蜜桃| 久久亚洲免费视频| 2018高清国产一区二区三区| 浪潮色诱AV久久久久久久| 在线观看免费精品国产| 麻豆精品乱码WWW久久密| 3d无遮挡h肉动漫在线播放| 美女岔开腿露出粉嫩花苞| 51xx午夜影视福利| 欧美多毛的大隂道| 大桥未久与黑人中出视频| 十8禁用B站在线看漫画| 国产伊人自拍| 婬香婬色天天视频|