- 締切済み
C言語にPGに関する質問ですが
C言語にPGに関する質問ですが、引数として(const char **)&cstrpと(char **)&cstrpとどんな違いがあるんですか?教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Fooky
- ベストアンサー率71% (59/82)
少ない情報からめちゃめちゃ類推して答えますが,例えばこんな状況ではないですか? 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)
前者は、キャストしたポインタを入れた変数(関数の引数としたときも同様)が 指し示す内容が変更不可になります。 つまり、 const char ** ppc; ppc = (const char **)&cstrp; /* OK */ *ppc = NULL; /* NG(コンパイルエラー) */ となります。