2017-11-12 11 views
1
typedef struct S { 
    int i; 
    char *pc; 
} S; 

void foo() { 
    char str[] = "abcdefg"; 
    const S cs = {1, str}; 
    // more code 
} 

csconst Sであり、そして私はそれがint *を必要とする機能に&cs.iを渡すだけconst int *できないのでcs.iは、有効const int iあります。const構造体インスタンス内の有効な型のメンバーですか?上記の例で

質問は、cs.pcの有効なタイプは何ですか? const char *またはchar * constですか?つまり、以下の関数のどれに&cs.pcを渡すことができますか?

A: void foo_a(const char * * ppcc); 
B: void foo_b(char * const * pcpc); 
+0

私を修正すること自由に感じ、私は「効果的なタイプ」の意味については、指定されたワードが何であるかわからないので、ケースには、私は間違っているか、私は適さない表現を使用。 – iBug

+1

struct内のデータだけがconstなので、アドレス(pcの値)だけがconstです。データpcが指し示すのは... –

+1

あなたの質問とは無関係ですが、アンダースコアで始まり大文字の文字( '_S'など)が続くシンボルは* all *スコープで予約されています。このようなシンボル名は使用しないでください。あなたの場合は、構造体(と共用体と列挙型)タグ(あなたの '_S'など)は独自の名前空間に存在するので、修正するのは簡単です。したがって、構造体を型名と同じ名前にすることができます。 –

答えて

0

この関数は、へのポインタconstへのポインタをとります。これは、次のプロトタイプを持っている:

void f(char * const *); 

説明:

const S cs = {1, str}const修飾子。各部材に適用される。 pcの場合、ポインタはその内容ではなく、であるため、そのタイプはchar * const(定数ポインタ)です。

はのは、単純な例で、それを説明してみましょう:Tある

int a = 100; 
int * const p = &a; 
T pp = &p; 

何?それは、intconstのポインタへのポインタを保持するのに適したタイプですので、このppの宣言は次のとおりです。

int *const *pp = &p; 

1)そのために、あなたが持っているだろうが、とそのメンバーの構造体の定義を変更する必要がありますconst char *pc;

+0

'char const *'は 'const char *'と同じです。 – iBug

-1

const char *ptrは:ptrは同じアドレスを指している必要がありますを意味し、あなたはptrは、いくつかの他のアドレスを保持するために期待することはできません。機能するためにそれを通過させながらだから

cs.pcは、const char *pcに他なりません

void foo_a(const char * * ppcc); //あなたは、オプションBを使用する必要がありますなぜ任意のアドレスに

のthatsを指すことができますbcz PPCCが動作しません

void foo_b(char * const * pcpc); 
+1

この回答はどのようにしてupvoteを得ることができますか? – iBug

関連する問題