指針 v.s. 引用

来源:http://www.cnblogs.com/kentax/archive/2016/01/23/5153465.html
-Advertisement-
Play Games

對C++的指針總覺得和引用差不多,其實還是挺有差別的。程式先看一個小程式: int a = 1; int& ra = a; int* pa = &ra; printf("&a = %02X\n", &a); //3EFCD0<< printf("a = %d\n", a...


對C++的指針總覺得和引用差不多,其實還是挺有差別的。

程式

先看一個小程式:

    int a = 1;
    int& ra = a;
    int* pa = &ra;

    printf("&a = %02X\n", &a); //3EFCD0<<
    printf("a = %d\n", a); //1
    printf("&ra = %02X\n", &ra); //3EFCD0<<
    printf("ra = %d\n", ra); //1
    printf("&pa = %02X\n", &pa); //3EFCB8
    printf("pa = %02X\n", pa); //3EFCD0<<
    printf("*pa = %d\n", *pa); //1

 

記憶體示意圖

 

編譯器的規則

電腦裡面是一個城市,

城市裡面有很多間房子,每個房子都有編號,每個房子裡面會放具體的材料。

城市裡面還有一個派出所,派出所裡面有很多小盒子,每個小盒子都有編號,盒子裡面放的就是城市裡面的門牌號碼。

程式員可以給房子盒子取名字,然後通過名字來得到他們。

房子:引用;盒子:指針;名字:變數名;門牌號,盒子編號:地址。

&得到門牌號或者盒子編號,*去到盒子裡面找到門牌號,找到對應房子裡面的東西。

 

程式編譯成下麵的故事

===註冊===

程式員:這裡有一個材料(1),幫忙找個房子放一下,

城市管理機構:找到一個門牌號(3EFCD0)的空房子,就用這個房子吧

程式員:好的,以後我就叫這個房子a吧

程式員:一個名字a還不夠,我還想給他取個名字叫做ra,留著備用

程式員:申請一個派出所的盒子,

城市管理機構:找到一個編號為(3EFCB8)的空盒子,就用這盒子吧

程式員:好的,以後我就叫這個盒子pa吧

程式員:這個盒子裡面放進剛纔那個房子ra門牌號吧。(當然也可以告訴他們用a門牌號)

 

===使用===

程式員:告訴我房子a的編號

程式員:告訴我房子a裡面裝了什麼

程式員:告訴我房子ra的編號

程式員:告訴我房子ra裡面裝了什麼

程式員:告訴我盒子pa的編號

程式員:告訴我盒子pa裡面裝了什麼(當然是那個門牌號)

程式員:告訴我盒子pa裡面裝門牌號碼對應房子裡面裝了什麼。

 

這樣看來指針(盒子)和引用(房子)還是有挺大差別的吧。

 

潛規則:

讓人討厭的就是這些潛規則 -___-||,但是記住會更加安全。

  • 房子申請了必須放東西(引用必須初始化),否則城市管理機構不幹(編譯不過),所以永遠不會存在空引用(對於C#er而言很難理解,C#的引用鑒於C++指針和引用之間),這樣省去了null check,更加高效。
    int & ra; //error C2530: “ra”: 必須初始化引用

     

  • 盒子申請可以不放東西(盒子不值錢,編譯沒有問題),但是要小心,在使用盒子前要自己先把門牌號放進去(運行時有問題),否則就要看城市管理機構心情,他們不會幫你清理盒子。
    int * pa;//運行時,使用沒有初始化的pa,會有這樣的異常:讀取位置 0xCCCCCCCC 時發生訪問衝突。

 

Q&A

Q: int a;可以嗎?

A: 編譯沒有問題,但是和指針一樣的問題,這個時候房子申請到了, 你不放材料進去,不知道城市管理機構會放什麼東西進去。所以總結而言:你申請東西的時候(房子或者盒子)的時候,最好初始化它,或者不要太久以後再去初始化,沒有壞處的,兄弟。

 

Q: 房子一旦申請就不能改變(引用不能改變),盒子卻可以改變裡面放在房子門牌號,怎麼理解?

A: 其實房子和盒子沒有本質的區別(怎麼又繞回來了@_@),因為他們都是一種東西,當你關註房子的時候,房子和盒子不一樣:房子不能變,盒子卻很靈活;但是如果你站在房子角度看房子,站在盒子的角度看盒子,是一樣的,盒子一旦申請盒子編號也是不能再改變了,盒子只能是那個盒子。換種說法吧,有些時候你可以吧盒子的編號放在另外的盒子裡面,被放進去的盒子就是和房子一樣的地位了。(指針的指針,忽然覺得還有好長的路...)

 

Q:下麵輸出是多少

int a = 1;
int& ra = a;
a = 2;

printf("ra = %d\n", ra);

A: "ra = 2"//因為ra和a就是同一個房子的兩個名字。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • iTop4412 irom啟動和Exynos4212 iROMBooting Guide是一樣的。製作itop4412 BL1的工具下載地址:http://download.csdn.net/detail/cj675816156/9101607iROM階段啟動流程本次介紹如何構建Exynos4412...
  • scanf()函數基礎擴充
  • 寫這篇博文的原因是因為自己寫的代碼經常會因為返工,delay項目的交付日期。總結了一下引起項目delay的原因,大概有如下幾點:在沒有完全深熟悉需求交互細節的情況下;諸如根據不同渠道設置不同的訂單狀態變更--超時提醒和訂單取消功能。在沒有想清楚自己代碼如何實現業務邏輯的情況下;諸如對騎手排班--.....
  • Python時間函數
  • 可以將列表和元組當成普通的“數組”,他能保存任意數量任意類型的Python對象,和數組一樣都是通過數字0索引訪問元素,列表和元組可以存儲不同類型的對象,列表和元組有幾處重要區別。列表元素用([])包括,元素的個數和值可以改變,而元組用({})包括,不能更改。元組可以看成是只讀的列表一、初識列表1、下...
  • 一、目標1、搭建傳統的ssh開發環境,併成功運行(插入、查詢)2、瞭解c3p0連接池相關配置3、瞭解驗證hibernate的二級緩存,並驗證4、瞭解spring事物配置,並驗證5、瞭解spring的IOC(依賴註入),將struts2的action對象(bean)交給spring管理,自定義bean...
  • 有時候面試的時候,面試官會問靜態方法里能不能調用非靜態方法,這時候呢,你的回答是什麼呢?雖然不能直接調用,但是可以間接的調用,可以通過將一個對象的引用傳入靜態方法中,再去調用該對象的非靜態方法。靜態方法通過用傳進來的對象引用調用非靜態方法,從而達到靜態方法調用非靜態方法。 1 public clas...
  • hi之前有將近兩周的時間沒有更新,除了懶就是其他的事情耽誤了。現在好了,回家了,雖然家裡停水,外面又有積雪,天寒地凍的,但諸多不便,都比不過有點閑的好。開搞每個學PHP的必經之路——電商網站的開發。1、電商網站開發——前端一、首頁製作1.1 概況&準備整個電商網站包括什麼呢,就是首頁信息,後面的.....
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...