在 C++ 中將 char** 類型傳遞給形參類型為 const char ** 或 const char * PARAMS[] 時,g++ 會報如下錯誤:
不過在 C 中只是報 warning.
我們知道 main 函數的標准原型應該是 int main(int argc, char *argv[]); argc 是命令行參數的個數。而 argv 是一個指向指針的指針,為什么不是指針數組呢?因為前面講過,函數原型中的[]表示指針而不表示數組,等價於 char **argv 。那為什么要寫成 char *argv[] 而不寫成 char **argv 呢?這樣寫給讀代碼的人提供了有用信息,argv 不是指向單個指針,而是指向一個指針數組的首元素。數組中每個元素都是 char * 指針,指向一個命令行參數字符串。(Linux C編程一站式學習,6. 指向指針的指針與指針數組,http://akaedu.github.io/book/ch23s06.html)
2、為什么不允許將 char** 賦值給 const char**
同樣一段代碼分別以 C++ 方式編譯和以 C 方式編譯,結果是不同的:
C 方式可以通過,C++ 方式是報錯的,這是 C 的一個缺陷,最后竟然修改了 const int x 的值!!!C++ FAQ. Why am I getting an error converting a Foo** → Foo const**?
正確的做法是:const int* const * q, 這樣 p 就可以賦值給 q 了。