const 二級指針:invalid conversion from 'char**' to 'const char**'


原文鏈接 

在 C++ 中將 char** 類型傳遞給形參類型為 const char ** 或 const char * PARAMS[] 時,g++ 會報如下錯誤:

[cpp]  view plain  copy
  1. error: invalid conversion from 'char**' to 'const char**'  

不過在 C 中只是報 warning.


1、函數原型中的 [] 表示指針,而不是數組

我們知道 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 方式編譯,結果是不同的:

[cpp]  view plain  copy
  1. int main()  
  2. {  
  3.     const int x = 1;  
  4.     int* p;  
  5.     int const** q = &p;  // q now points to p; this is (fortunately!) an error  
  6.     *q = &x;             // p now points to x  
  7.     *p = 2;  
  8. }  
  9. // gcc -Wall test.c -o test  
  10. // g++ -Wall test.cpp -o test  
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 了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM