1 const修飾指針
const是 constant 的縮寫,本意是不變的,不易改變的意思。在 C++ 中是用來修飾內置類型變量,自定義對象,成員函數,返回值,函數參數。C++
const允許指定一個語義約束,編譯器會強制實施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。https://www.runoob.com/w3cnote/cpp-const-keyword.html
1.1 const修飾變量
變量是可以修改的,如果把變量的地址交給一個指針變量,通過指針變量也可以修改這個變量。但是如果我們希望一個變量加上一些限制,不能被修改,怎麼做呢?這就是const的作用。
可見無法直接修改n的值了,編譯器會報錯。
不過,如果我們繞過n,使用n的地址,去修改n就能做到了,雖然這樣做是在打破語法規則。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int const n = 10;
//n = 3;
int* p = &n;
*p = 5;
printf("%d", *p);
return 0;
}
n的值通過指針被修改了,但是我們還是要思考一下,為什麼n要被const修飾呢?就是為了不能被修改,如果p拿到n的地址就能修改n,這樣就打破了const的限制,這是不合理的,所以應該讓p拿到n的地址也不能修改n,那接下來怎麼做呢?
1.2 const修飾指針變量
一般來講const修飾指針變量,可以放在*的左邊,也可以放在*的右邊,意義是不一樣的。
int* const p;//放在*的右邊
int const* p;//放在*的左邊
我們來看看下面的對比代碼:
void test1()
{
int n = 10;
int m = 20;
int* const p = &n;
p = &m;
*p = 50;
}
void test2()
{
int n = 10;
int m = 20;
int const* p = &n;
p = &m;
*p = 50;
}
int main()
{
//int* const p
test1();
//int const* p
test2();
return 0;
}
結論:const修飾指針變量的時候
const如果放在*的左邊,修飾的是指針指向的內容,保證指針指向的內容不能通過指針來改變。但是指針變量本身的內容可變。(不能通過*p = ...來修改目標值)const如果放在*的右邊,修飾的是指針變量本身,保證了指針變量的內容不能修改,但是指針指向的內容,可以通過指針改變。(不能p = ...來改變指針指向)
還有一種常見情況,*的左右兩邊都有const。這樣指針本身和指向的內容都不可修改。
void test3()
{
int n = 10;
int m = 20;
int const* const p = &n;
p = &m;//報錯
*p = 50;//報錯
}
int main()
{
//int const* const p
test3();
return 0;
}