C 專題 const那點事兒

2022-07-11 23:21:12 字數 4172 閱讀 2567

目錄限定符const是老生常談的話題了,不管是面試還是平時工作都會經常遇到,你真的對它了解了麼?我這裡主要是從三個維度進行總結,並進行例項驗證。

const修飾內建型別:

// 以下兩種表達是等價的

const int a = 0;

int const b = 1;

a = 1; // 不允許,編譯報錯

b = 2; // 不允許,編譯報錯

const修飾指標

int age = 1;

const int *p = &age; // 不能使用p修改其指向的記憶體,*p是常量

int* const q = &age; // 不能改變指標指向的位置,q是常量

int sage = 2;

p = &sage; // 允許

*p = 3; // 不允許

*q = 4; // 允許

q = &sage // 不允許

const修飾函式

int f() const {}    // 表示該函式函式不能修改成員變數的值(針對類)

const int f() {} // 表示該函式的返回值,沒什麼意義,函式返回值是匿名臨時變數,函式呼叫完成會銷毀,所以本質上沒有什麼作用

const修飾全域性變數

#include using namespace std;

const int a = 0;

int main()

彙編**如下:

a.out:	file format mach-o 64-bit x86-64

disassembly of section __text,__text:

0000000100000fb0 _main:

100000fb0: 55 pushq %rbp

100000fb1: 48 89 e5 movq %rsp, %rbp

100000fb4: 31 c0 xorl %eax, %eax

100000fb6: 5d popq %rbp

100000fb7: c3 retq

contents of section __text:

100000fb0 554889e5 31c05dc3 uh..1.].

contents of section __unwind_info:

100000fb8 01000000 1c000000 00000000 1c000000 ................

100000fc8 00000000 1c000000 02000000 b00f0000 ................

100000fd8 34000000 34000000 b90f0000 00000000 4...4...........

100000fe8 34000000 03000000 0c000100 10000100 4...............

100000ff8 00000000 00000001 ........

extern修飾const全域性變數

#include using namespace std;

extern const int a = 888;

int main()

彙編**如下:

a.out:	file format mach-o 64-bit x86-64

disassembly of section __text,__text:

0000000100000fa0 _main:

100000fa0: 55 pushq %rbp

100000fa1: 48 89 e5 movq %rsp, %rbp

100000fa4: 31 c0 xorl %eax, %eax

100000fa6: 5d popq %rbp

100000fa7: c3 retq

contents of section __text:

100000fa0 554889e5 31c05dc3 uh..1.].

// 區別在這,常量區,100000fa8是記憶體位址,78030000是字面值888

contents of section __const:

100000fa8 78030000 x...

contents of section __unwind_info:

100000fac 01000000 1c000000 00000000 1c000000 ................

100000fbc 00000000 1c000000 02000000 a00f0000 ................

100000fcc 34000000 34000000 a90f0000 00000000 4...4...........

100000fdc 34000000 03000000 0c000100 10000100 4...............

100000fec 00000000 00000001 ........

const修飾區域性變數

#include using namespace std;

int main()

彙編**如下:

a.out:	file format mach-o 64-bit x86-64

disassembly of section __text,__text:

0000000100000fa0 _main:

100000fa0: 55 pushq %rbp

100000fa1: 48 89 e5 movq %rsp, %rbp

100000fa4: 31 c0 xorl %eax, %eax

// 區別在這,區域性變數是分配了記憶體的,將0賦值給棧中的變數(占用棧空間)

100000fa6: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)

100000fad: 5d popq %rbp

100000fae: c3 retq

contents of section __text:

100000fa0 554889e5 31c0c745 fc000000 005dc3 uh..1..e.....].

contents of section __unwind_info:

100000fb0 01000000 1c000000 00000000 1c000000 ................

100000fc0 00000000 1c000000 02000000 a00f0000 ................

100000fd0 34000000 34000000 b00f0000 00000000 4...4...........

100000fe0 34000000 03000000 0c000100 10000100 4...............

100000ff0 00000000 00000001 ........

關於這個問題,之前沒有了解過,查詢書籍沒有得到比較滿意的答覆,這裡借用這個小哥哥的博文,自己感覺寫的挺好的,學習一下,後續再驗證。詳情點我

C語言關於const的那點事兒

const應該是單詞constant的縮寫,意思是永恆的不變的。const這個關鍵字用得到的地方很多,用的方式也很多,因此讓人疑惑的地方也比較多,今天做個總結。const int a int const a 都是把a常量化了,告訴大家不要修改a的值,如果你非要修改a的值 const int a 10...

C 的那點事兒

一 預處理 定義 在編譯之前所做的處理,主要包括 標頭檔案 預處理會展開 巨集定義 預處理會替換掉 條件編譯 二 標頭檔案 作用 將一些公用 如函式原型宣告,型別宣告,全域性變數宣告,巨集定義等,放到乙個檔案中,以提供跨工程 復用,減少 重複書寫。處理方式 內容展開 若標頭檔案中有遞迴包含逐級展開 ...

游標那點事兒

兩種迴圈跳出方法 1 稍顯複雜點 create procedure dbo.usp cralltables client id varchar 256 asdeclare table name varchar 50 set nocount on declare t name cur cursor l...