最近一直在准備筆試,復習C語言時碰見這麼個題:
int a=248, b=4;
int const c=21;
const int *d=&a;
int *const e=&b;
int const * const f =&a;
請問下列表達式哪些會被編譯器禁止?
A:*c=32
B:*d=43
C:e=&a
D:f=0x321f
E:d=&b
F:*e=34
下面逐條分析
第一行代碼不提, 第二行,int const c=21;和const int c=21;是一個意思,都是修飾c為const,即c的值不能變化。所以A,肯定錯,c就不是一個指針;
第三行:const int *d=&a;表示d指向的值是不可通過指針改變的,所以B:*d=43錯誤。而d的指向是可變的,這裡d=&a,E:d=&b也是正確的;
第四行:int *const e=&b;表示指針e的指向是不能改變的,所以C錯;但可以改變指向的值,*e=34是正確的,F正確;
第五行:int const * const f =&a;表示指針f的指向和指向的內容都不能改變,D錯誤
題目問哪些會被禁止,所以答案是ABCD。
這裡百度百科裡介紹了一個方法:
const在*的左邊,則指針指向的變量的值不可直接通過指針改變(可以通過其他途徑改變);在*的右邊,則指針的指向不可變。簡記為“左定值,右定向”
但是一定要注意,int * const p; int const * const p; 或者 const int * const p;這三種表示都是指針指向不能改變的,定義時要初始化一個地址。
基本上const就沒問題了~