C 指標與引用的本質區別

2021-05-23 08:00:14 字數 820 閱讀 3824

//看如下例子:

int a = 0;              // int型變數a

int *pi = &a;           // 指向int型的指標變數pi

int& ri = a;            // int型的引用ri,引用的變數為a

int& rt = *(int*)0x01;  // int型的引用rt,引用的記憶體位址為0x01

到了編譯器,產生四個符號,a,pi,ri,rt.

rt標示了一塊記憶體,這塊記憶體位址為0x01

a和ri完全一樣,他們標示了一塊int的記憶體比如0x0012ff70,其內容為00000000

pi首先為乙個變數,它有自身的記憶體位址,即pi標示了一塊記憶體,比如0x0012ff6c.其內容極為a所標示的記憶體位址0x0012ff70

由於程式語言的設計,引用ri只有在宣告時才有機會初始化(也必須初始化),即告知編譯器該引用引用的是哪一塊記憶體(或變數).因為一旦宣告結束,之後看到該引用時,等同於它所引用的那塊記憶體(或變數)

而指標,由於其本身為乙個變數,一般情況下都是可以改變這個變數的值的.所以,理論上可以使用乙個指標,通過改變指標變數本身的值,來(簡介)訪問,或者修改任何一塊記憶體,所以指標功能強大,同樣也相當危險

一般,引用總是引用乙個有意義的變數.像int& ri = a;使用,這樣的話,引用一般是比較安全的.所以很多書上都說引用無需判斷其有效性.

但是同樣int& rt = *(int*)0x01;的使用一般也是沒有編譯問題的.所以,如果引用在使用不當的時候,跟指標的危險性幾乎是一樣的.

問過很多人,指標和引用是一樣的.我相信他們都是高手.至少,對於c++有著相當的認識.

require與import的本質區別

node程式設計中最重要的就是模組化,import和require都是被模組化所使用的 遵循規範 require是amd規範引入 amd是依賴前置,預載入 import是es6的乙個語法標準,如果要相容瀏覽器的話必須轉化成es5的語法 require是執行時間,所以require理論上可以執行在 的...

OC 和 C 的本質區別

oc使用訊息結構 messaging structure c使用函式呼叫 function calling 訊息結構 執行時所執行的 由執行環境決定 動態繫結 函式呼叫 執行時所執行的 由編譯器決定 oc的重要工作都有 執行期元件 runtime component 而非編譯器完成,包括 oc物件導...

指標變數和非指標變數的本質區別

指標變數本質上是指乙個儲存了位址的 乙個 變數。因此無論哪種型別的指標,變數占用的位址是固定的,32位cpu則為4bytes,16為cpu則為2bytes。而變數占用的記憶體空間直接和變數型別相關,因為變數需要保持和該型別所有的資料。下面看乙個例子 include typedef struct st...