• 締切済み

C言語にPGに関する質問ですが

C言語にPGに関する質問ですが、引数として(const char **)&cstrpと(char **)&cstrpとどんな違いがあるんですか?教えてください。

みんなの回答

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.2

少ない情報からめちゃめちゃ類推して答えますが,例えばこんな状況ではないですか? void func( const char **ptr ); int main(int argc, char **argv) {  char *cstrp;  func( &cstrp ); /* ここでwarning */  func( (const char **)&cstrp ); /* OK */ } コンパイラにも依ると思いますが,const char**を引数に取る関数にchar**を渡すと警告が出ます.*が一個減ってconst char *を引数に取る関数にchar *を渡すのは問題ないにも関わらずです. これは,次のような例が起こりうる事への警告です. void func( const char **ptr ) {  static const char *Str = "EXAMPLE";  *ptr = Str; } int main( int argc, char **argv ) {  char *cstrp;  func( &cstrp );  cstrp[0] = 'e';  /* ↑func関数内のconst char型配列Strの内容を書換えようとしている!*/ }

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

前者は、キャストしたポインタを入れた変数(関数の引数としたときも同様)が 指し示す内容が変更不可になります。 つまり、 const char ** ppc; ppc = (const char **)&cstrp; /* OK */ *ppc = NULL; /* NG(コンパイルエラー) */ となります。

関連するQ&A

専門家に質問してみよう