在討論賦值問題以前,我們先看ANSI C標準6.3.16.1,包含了以下限制
- 兩個操作都是指向有修飾符或無修飾符相容類型的指標
- 左邊指標指向類型必須擁有右邊指標指向類型的所有修飾符
char* 和 const char* 賦值
接著我們看一下下面這段程式碼
1 | char *cp; |
- 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 | char **cp; |
使用gcc編譯後會得到下面訊息,為什麼多了一層的指標就無法順利編譯完成了呢?
根據ANSI C標準6.1.2.5
- char** 型別為指向char型別指標的指標,沒有修飾符
- const char** 為指向有const修飾符指標的指標,沒有修飾符
兩者指向的型別不一樣,違反了上述標準的第一項
Note : 部分編譯器並不遵守此項規範,但為了程式的可移植性,還是盡量避免這樣的用法