[C語言] - char** 和 const char** 賦值問題

在討論賦值問題以前,我們先看ANSI C標準6.3.16.1,包含了以下限制

  1. 兩個操作都是指向有修飾符或無修飾符相容類型的指標
  2. 左邊指標指向類型必須擁有右邊指標指向類型的所有修飾符

char* 和 const char* 賦值

接著我們看一下下面這段程式碼

1
2
3
4
char *cp;
const char *ccp;
ccp = cp;
cp = ccp;
  • char* 型別為指到char型別的指標,且由const修飾
  • const char* 型別為指到char型別的指標,沒有修飾符

使用gcc編譯後會得到下面訊息,為什麼cp = ccp會有warning?原因如下

  • ccp和cp皆為指到char型別的指標,只是ccp有const修飾符,符合上述ANSI C標準第一項
  • ccp = cp左操作(const)擁有右操作(none)所有修飾符,符合上述標準第二項
  • cp = ccp左操作(none)沒有擁有右操作(const)所有修飾符,違反上述標準第二項

事實上這樣的限制也蠻好理解的,若是cp = ccp成立的話,那我們就可以用任意的指標修改一個經由const修飾過後的指標的值

char** 和 const char** 賦值

接著我們看以下這段程式碼

1
2
3
char **cp;
const char **ccp;
ccp = cp;

使用gcc編譯後會得到下面訊息,為什麼多了一層的指標就無法順利編譯完成了呢?

根據ANSI C標準6.1.2.5

  • char** 型別為指向char型別指標的指標,沒有修飾符
  • const char** 為指向有const修飾符指標的指標,沒有修飾符

兩者指向的型別不一樣,違反了上述標準的第一項

Note : 部分編譯器並不遵守此項規範,但為了程式的可移植性,還是盡量避免這樣的用法