C 中的 const 引用和指標的深入分析

2022-08-18 10:39:13 字數 3422 閱讀 3448

1,關於 const 的疑問:

1,const 什麼時候為唯讀變數,什麼時候是常量;

1,const 從 c 到 c++ 進化的過程中得到了公升級,const 在 c++ 中不僅僅像在 c 中宣告乙個唯讀變數,其在 c++ 中完全可以得到乙個常量;

2,const 常量的判別準則:

1,只有用字面量初始化的 const 常量才會進入符號表;

1,這裡是字面量初始化 const 常量,不是 const 常引用;

2,得到了真正意義上的常量;

2,使用其他變數初始化的 const 常量仍然是唯讀變數;

1,編譯器在編譯期間不可能知道變數初始化時候的值;

2,得到唯讀變數;

3,被 volatile 修飾的 const 常量不會進入符號表;

1,volatile 表示宣告的識別符號是易變的;

2,這個可能的易變性也許不在當前編譯的檔案中,發生在外部;

3,外部相當於在其它檔案中,比如多執行緒、中斷等;

4,每次訪問 volatile 修飾的識別符號時,因為是易變的,所以應該到記憶體中直接讀取;

5,意味著被 volatile 修飾的識別符號不可能進入符號表;

6,意味著當 volatile 和 const 同時修飾乙個識別符號時,得到的是唯讀變數,不可能進入符號表;

7,const 此時的意義說明在當前的檔案或者當前的作用域當中,volatile 和 const 一起修飾的識別符號不能出現在賦值符號的左邊;

(4),在編譯期間不能直接確定初始值的 const 識別符號,都被作為唯讀變數處理;

3,const 引用的型別與初始化變數的型別:

1,相同:初始化變數成為唯讀變數;

2,不同:生成乙個新的唯讀變數;

4,const 典型問題分析程式設計實驗:

1,main.cpp 檔案:

1 #include 2

3int

main()

4

2,輸出結果:

1 x = 1

//進入符號表,編譯期間就是 1;

2 rx = 5

3 nrx = 5

4 &x = 0xbfb1a708

//為const修飾的識別符號分配空間,通過指標或引用使用;

5 &rx = 0xbfb1a708

6 &nrx = 0xbfb1a708

7 y = 6

8 p = 0xbfb1a6fc

9 z = 7

10 p = 0xbfb1a6f4

11 c =a

12 rc =a

13 trc = c //

原始的賦值結果;

14 &c = 0xbfd1242f

15 &rc = 0xbfd1242f

16 &trc = 0xbfd12408

//新開闢的空間;

5,關於引用的疑問:

1,引用與指標有什麼關係,如何理解「引用的本質就是指標常量」;

6,指標和引用分析:

1,指標是乙個變數:

1,值為乙個記憶體位址,不需要初始化,可以儲存不同的位址;

2,通過指標可以訪問對應記憶體位址中的值;

3,指標可以被 const 修飾成為常量或者唯讀變數;

2,引用只是乙個變數的新名字:

1,對引用的操作(賦值,取位址等)都會傳遞到代表的變數上;

1,新名字是一段記憶體空間的代號;

2,引用是給已經存在的合法記憶體空間乙個新的代號;

2,const 引用使其代表的變數具有唯讀屬性;

3,引用必須在定義時初始化,之後無法代表其它變數;

1,身份證號代表乙個人,不能復用;

2,乙個車牌號就代表乙個車,不能復用;

3,因為是指標常量,所以不能代表其它變數;

7,從 c++ 不同角度分析引用:

1,從使用 c++ 語言的角度來看:

1,引用與指標沒有任何的關係;

2,引用是變數的新名字,操作引用就是操作對應的變數;

2,從 c++ 編譯器的角度來看:

1,為了支援新概念,「引用」必須要乙個有效的解決方案;

2,在編譯器內部,使用指標常量來實現「引用」;

3,因此「引用」在定義時必須初始化;

8,在工程專案開發中:

1,當進行 c++ 程式設計時,直接站在使用的角度看待引用,與指標毫無關係,引用就是變數的別名;

2,當對 c++ **進行除錯分析時,一些特殊情況,可以考慮站在 c++ 編譯器角度看待引用;

3,下面**正確嗎?

1

int a = 1;2

int b = 2;3

int* pc = new

int(3);4

int& array = [a, b, *pc];

9,引用典型問題分析程式設計實驗:

1,main.cpp 檔案:

1 #include 2

3int a = 1;4

5structsv6

;1112int

main()

13; //

結構體中的每個元素是引用就可以;

17//

int& array = ;

//陣列中的每個元素是引用就不可以;error: declaration of 『array』 as array of references; c++ 天生要支援 c 語言,c 語言中陣列中的每個元素在記憶體中是順序存放的,位址是遞增的,所以在 c++ 中也要相容這個特性,而在 c++ 中唯有引用陣列破快了這個特性,所以說 c++ 中不支援引用陣列;&array[1] - &array[0] = ? expected ==> 4;

1819 printf("

&sv.x = %p\n

", &sv.x);

20 printf("

&sv.y = %p\n

", &sv.y);

21 printf("

&sv.z = %p\n

", &sv.z);

2223

delete

pc;24

25return0;

26 }

2,輸出結果:

&sv.x = 0x804a020

&sv.y = 0xbffe92bc

&sv.z = 0x9f97008

3,在開發中遇到奇怪的 bug,要站在編譯器的角度考慮問題;

10,小結:

1,指標是乙個變數;

2,引用是乙個變數的新名字;

3,const 引用能夠生成新的唯讀變數;

4,在編譯器內部使用指標常量實現「引用」;

1,c++ 中為了相容 c 語言中的所有特性,放棄了引用陣列,這樣會使得相鄰元素的位址之差不是期望的;

5,編譯時不能直接確定初始值的 const 識別符號都是唯讀變數;

指標和引用,const 指標和const 引用

指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...

C 中引用 指標 const

引用變數名不存在實體,即在記憶體中存沒有為此變數開闢記憶體空間。如int a0,程式會在記憶體中建立2或4位元組的空間儲存a0變數,但int a1 a0,並不會在記憶體中開闢乙個2或4位元組的空間來儲存a1,而是將a1和a0關聯起來,通過操作a1可操作a0 功能類似指標 既然如此,為何非得多此一舉?...

C 中const引用和非const引用的使用注意

今天學習時突然有疑惑,c 有了指標為何還要設計引用呢?後來看到一篇部落格豁然開朗 為什麼 c 有指標了還要引用?總結一下 更加簡潔好看了 由於引用必須被初始化,並且之後也無法重新繫結其他物件,這樣就更安全了 為了操作符過載,比如部落格中那個過載 的例子 並且,在了解了這些之後,對引用的一些其他特性也...