目錄
一、const修飾變量
繞過const限制的問題
二、const修飾指針變量
1、無const修飾的指針
2、const放在*左邊
3、const放在*右邊
4、*兩邊都有const
三、使用建議
四、記憶技巧
一、const修飾變量
????????在C語言中,變量默認是可修改的。如果我們希望某個變量不能被修改,可以使用const
關鍵字進行修飾。
#include <stdio.h>int main()
{int m = 0;m = 20; // m是可以修改的const int n = 0;n = 20; // 編譯錯誤:n不能被修改return 0;
}
? ? const
修飾的變量n本質仍然是變量,但在語法層面添加了限制,任何直接修改n的操作都會導致編譯錯誤。
繞過const限制的問題
雖然直接修改const變量會導致編譯錯誤,但通過指針間接修改在語法上是可能的:
#include <stdio.h>int main()
{const int n = 0;printf("n = %d\n", n); // 輸出: n = 0int* p = &n; // 獲取n的地址*p = 20; // 通過指針修改n的值printf("n = %d\n", n); // 輸出: n = 20return 0;
}
運行結果:
????????這種操作雖然能修改n的值,但違背了使用const的初衷。為了真正保護變量不被修改,我們需要正確使用const修飾指針。
二、const修飾指針變量
const修飾指針變量時,根據const關鍵字相對于星號(*)的位置不同,其含義也不同:
int * p;//沒有const修飾? int const * p;//const 放在*的左邊做修飾
//上面這一句等價于
const int * p;//const 放在*的左邊做修飾 int * const p;//const 放在*的右邊做修飾
1、無const修飾的指針
void test1()
{int n = 10;int m = 20;int* p = &n;*p = 20; // 可以修改指針指向的內容p = &m; // 可以修改指針本身
}
2、const放在*左邊
void test2()
{int n = 10;int m = 20;const int* p = &n; // 或 int const* p = &n;*p = 20; // 編譯錯誤:不能通過指針修改指向的內容p = &m; // 可以修改指針本身
}
3、const放在*右邊
void test3()
{int n = 10;int m = 20;int* const p = &n;*p = 20; // 可以修改指針指向的內容p = &m; // 編譯錯誤:不能修改指針本身
}
4、*兩邊都有const
void test4()
{int n = 10;int m = 20;const int* const p = &n;*p = 20; // 編譯錯誤:不能通過指針修改指向的內容p = &m; // 編譯錯誤:不能修改指針本身
}
三、使用建議
-
保護數據不被修改:如果希望數據不被修改,應該使用
const type*
或const type* const
形式 -
保護指針不被修改:如果希望指針本身不被修改,應該使用
type* const
形式 -
最佳實踐:在函數參數中,如果函數不需要修改指針指向的數據,應該使用
const
修飾指針參數,這樣既能保護數據,又能使函數接受const和非const的實參
四、記憶技巧
可以這樣記憶const修飾指針的規則:
-
const在*左邊:保護"星"指向的內容(數據不可變)
-
const在*右邊:保護"星"本身(指針不可變)
-
兩邊都有const:都保護
????????這種修飾方式在C/C++中廣泛使用,特別是在函數參數傳遞和API設計中,能夠有效提高代碼的安全性和可維護性。