2009-04-19 22 views
4

documentation from Microsoftのscanfに(const char *)があり、this questionの答えがあれば、(char **)のプロモーション(const char **)に同じことをすると、何が起こっているのでしょうか?これは(char *)から(const char *)へのプロモーションをなぜ許可しますか?

基本的に、これはなぜコンパイルされますか?

#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    char szArray[50]; 
    int i = 0; 
    strcpy(szArray,"10"); 
    /* the following code is upcasting the (char *) to (const char *) */ 
    sscanf(szArray,"%d",&i); 
    return 0; 
} 

これはなぜコンパイルされませんか?

#include <stdio.h> 
void processargs(const char **p) 
{ 
} 
int main(int argc, char **argv) 
{ 
    processargs(argv);   
    return 0; 
} 

どちらもポインタと同じことをしているようです!

+1

あなたは1つのことを理解していません:もしT - > Uが働くなら、それはT * - > U *が意味するものではありません。単純なもの:double a = 4;/* int - > double */int p;ダブル* dp =&p;/* int * - > double * ?? */ –

+0

私はここでタイプを変更していません...両方のセットはポインタです。 – ojblass

+0

これ以外のものを閉じてください。 – ojblass

答えて

12

char** -> const char **は、間違って基になるconstオブジェクトを変更する可能性があるため、危険です。

あなたが欲しいものを書くための正しい方法は次のとおりです。

void processargs(const char * const *p) 
{ 
} 
+0

ブラボー...私はついにそれを手に入れました。 – ojblass

+3

constをこの方法で使用することができます。私はあなたがこれを行うことができることを多くの人が知っているとは思わない。 –

+0

私は私に新しいことをしなかった... – Aaron

3

アクセス制限を増やすことはできますが、それを減らすことはできません。通常のポインタからconstポインタへ行くのは問題ありません。constポインタから通常のポインタに移動するのは適切ではありません。

ポインタをconstポインタに変換せず、ポインタをあるタイプ(char*)から別のポインタ(const char*)に変換しているため、2番目の例はコンパイルされません。たとえば、char**char* const*に変更できますが、const char**は変更できません。

+0

さて、2番目の例ではコンパイルできません。 – ojblass

0

あなたの最初の例は動作しますが、あなたが割り当てることはできません基本的にので(OKである、const char*右辺値char*を変換しているので、値にする)。 2番目の引数は、(非const)ポインタのターゲットが常に左辺値なので、そうではありません。

const char**で動作するchar**でどの操作を行うことができますか(おそらくコンパイラの助けを借りて)、互換性があるかどうかと考えます。

2

チェックこれはあなたのための明確場合:

char * a_mutable = /*...*/; 
const char * a_constant = /*...*/; 

char **pointer_to_mutable = &a_mutable; /* ok */ 

const char **pointer_to_constant = &a_constant; /* ok */ 

pointer_to_constant = pointer_to_mutable; /* oops, are you sure? */ 

*pointer_to_constant = a_mutable; /* valid, but will screw things around */ 

pointer_to_constantは文字定数への変更可能なポインタへのmutableなポインタであるため、最後の行は、有効ですが、あなたはa_constantポイントを作っているので、それは物事を破りますa_mutable。そのため、の内容をpointer_to_constantに受信させることはできません。

関連する問題