const char*, char const*, char*const 有何區別?

大雄45發表於2020-08-07
導讀 const char*, char const*, char*const幾種容易混淆,以下筆記對三者的區別進行介紹。

const char*, char const*, char*const 有何區別?const char*, char const*, char*const 有何區別?

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關鍵字放在型別或變數名之前等價的。

const int n=5;    //same as below
int const m=10;
const int *p;    //same as below  const (int) * p
int const *q;    // (int) const *p
char ** p1; 
//    pointer to    pointer to    char 
const char **p2;
//    pointer to    pointer to const char 
char * const * p3;
//    pointer to const pointer to    char 
const char * const * p4;
//    pointer to const pointer to const char 
char ** const p5;
// const pointer to    pointer to    char 
const char ** const p6;
// const pointer to    pointer to const char 
char * const * const p7;
// const pointer to const pointer to    char 
const char * const * const p8;
// const pointer to const pointer to const char

說到這裡,我們可以看一道以前Google的筆試題:

const char *p="hello";       
foo(&p);  // 函式foo(const char **pp)下面說法正確的是[]
  1. A.函式foo()不能改變p指向的字串內容。

  2. B.函式foo()不能使指標p指向malloc生成的地址。

  3. C.函式foo()可以使p指向新的字串常量。

  4. D.函式foo()可以把p賦值為 NULL。

至於這道題的答案是眾說紛紜。針對上面這道題,我們可以用下面的程式測試:

#include#include#includevoid foo(const char **pp)
{
//    *pp=NULL;
//    *pp="Hello world!";
        *pp = (char *) malloc(10);
        snprintf(*pp, 10, "hi google!");
//       (*pp)[1] = 'x';
}
int
main()
{
    const char *p="hello";
    printf("before foo %s/n",p);
    foo(&p);
    printf("after foo %s/n",p);
    p[1] = 'x';
    return;
}

結論如下:

  1. 在foo函式中,可以使main函式中p指向的新的字串常量。
  2. 在foo函式中,可以使main函式中的p指向NULL。
  3. 在foo函式中,可以使main函式中的p指向由malloc生成的記憶體塊,並可以在main中用free釋放,但是會有警告。但是注意,即使在foo中讓p指向了由malloc生成的記憶體塊,但是仍舊不能用p[1]='x';這樣的語句改變p指向的內容。
  4. 在foo中,不能用(*pp)[1]='x';這樣的語句改變p的內容。

所以,感覺gcc只是根據const的字面的意思對其作了限制,即對於const char*p這樣的指標,不管後來p實際指向malloc的記憶體或者常量的記憶體,均不能用p[1]='x'這樣的語句改變其內容。但是很奇怪,在foo裡面,對p指向malloc的記憶體後,可以用snprintf之類的函式修改其內容。

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2710150/,如需轉載,請註明出處,否則將追究法律責任。

相關文章