const char*, char const*, char*const的區別問題幾乎是C++面試中每次都會有的題目。
事實上這個概念誰都有,只是三種聲明方式非常相似很容易記混。
Bjarne在他的The C++ Programming Language裡面給出過一個助記的方法:
把一個聲明從右向左讀。
char * const cp; ( * 讀成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因為C++裡面沒有const*的運算子,所以const只能屬於前面的類型。
C++標準規定,const關鍵字放在類型或變數名之前等價的。
關於char **p 、const char **p的類型相容性問題
1。問題
char *p1;const *p2=p1;//合法
char **p1;const char**p2=p1;//不合法,會有警告warning: initialization from incompatible pointer type
char **p1;char const**p2=p1;//不合法,會有警告warning: initialization from incompatible pointer type
char**p1;char*const*p2=p1;//合法
2。判斷規則
明確const修飾的對象!對於指標p1,和p2,若要使得p2=p1成立,則可讀做 :
“p1是指向X類型的指 針,p2是指向“帶有const限定”的X類型的指標 “。
char *p1;const char *p2=p1;//合法:p1是指向(char)類型的指標,p2是指向“帶有const限定"的(char)類型的指標。
char **p1;const char**p2=p1;//不合法:p1是指向(char*)類型的指標,p2是指向 ((const char)*)類型的指標。
char **p1;char const**p2=p1;//不合法;與上等價。
char**p1;char*const*p2=p1;//合法: p1是指向(char *)類型的指標,p2是指向“帶有const限定"的(char*)類型的指標。
最後上一個例子:
#include <stdio.h>int main(void){ int v1 = 1; int v2 = 2; int const *a = &v1; *a = 2; int *const b = &v2; b = &v1; char**p1; char*const*p2=p1; *p2 = &v1; return 0;}
編譯時間出現如下錯誤:
const.c: In function 'main':
const.c:9: error: assignment of read-only location '*a'
const.c:12: error: assignment of read-only variable 'b'
const.c:16: error: assignment of read-only location '*p2'