A.const修飾變量
??變量是可以修改的,如果把變量的地址交給?個指針變量,通過指針變量的也可以修改這個變量。
? 但是如果我們希望?個變量加上?些限制,不能被修改,怎么做呢?這就是const的作?。
#include <stdio.h>
int main()
{int m = 0;m = 20;//m是可以修改的const int n = 0;n = 20;//n是不能被修改的return 0; }
? 上述代碼中n是不能被修改的,其實n本質是變量,只不過被const修飾后,在語法上加了限制,只要我們在代碼中對n就?修改,就不符合語法規則,就報錯,致使沒法直接修改n。因為在經過const修飾后,變量有了常量的屬性,我們通常稱之為常變量,但它的本質屬性仍為變量。
? 但是如果我們繞過n,使?n的地址,去修改n就能做到了,雖然這樣做是在打破語法規則。
#include <stdio.h>
int main()
{const int n = 0;printf("n = %d\n", n);int*p = &n;*p = 20;printf("n = %d\n", n);
return 0; }
? 我們可以看到這??個確實修改了,但是我們還是要思考?下,為什么n要被const修飾呢?就是為了不能被修改,但const只是限制了n,沒有限制*p,所以如果p拿到n的地址就能修改n,這樣就打破了const的限制,這是不合理的,所以應該讓p拿到n的地址也不能修改n,那接下來怎么做呢?
B.const修飾指針
??我們看下?代碼,來分析
#include <stdio.h>
//代碼1
void test1()
{int n = 10;int m = 20;int *p = &n;*p = 20;//ok?p = &m; //ok?
}
void test2()
{//代碼2int n = 10;int m = 20;const int* p = &n;*p = 20;//ok?p = &m; //ok?
}
void test3()
{int n = 10;int m = 20;int *const p = &n;*p = 20; //ok?
p = &m; //ok?
}
void test4()
{int n = 10;int m = 20;int const * const p = &n;*p = 20; //ok?p = &m; //ok?
}
int main()
{//測試?const修飾的情況test1();//測試const放在*的左邊情況test2();//測試const放在*的右邊情況test3();//測試*的左右兩邊都有consttest4();return 0; }
結論:const修飾指針變量的時候
? const如果放在*的左邊,修飾的是指針指向的內容,保證指針指向的內容不能通過指針來改變。
但是指針變量本?的內容可變。
? const如果放在*的右邊,修飾的是指針變量本?,保證了指針變量的內容不能修改,但是指針指
向的內容,可以通過指針改變。