2013-04-10 14 views

答えて

6

ここでの混乱は、{"Hey","Hello"}が配列であるという信念に由来すると思います。そうではありません。それはまったく目的ではありません。これは、配列を初期化するために使用できる特殊な初期化構文です。 char**は、配列ではなくポインタであるため、char**の初期化には使用できません。ポインタに変換できる配列オブジェクトは自動的に作成されません。

おそらく、あなたはそれをPythonの[...]リストやJavaScriptの{ ... }オブジェクトのように考えていたかもしれません。それはまったくそうではありません。これらの式は実際にその型のオブジェクトを作成し、それらのオブジェクトを取ることができる式のどこでも使用できます。C++で使用している構文は、の初期化構文です。例えば

、あなたははこれを行うことができます:

const char* array[] = {"Hey","Hello"}; 
const char** p = array; 

あなたは、しかし、このような愚かな何かを行うことができない:私たちは実際には配列オブジェクトを作成した。ここ

std::cout << {"Hey", "Hello"}[1]; 

のものでポインタが格納されます。その後、その配列をconst char**に変換できます。

+0

非常にクリア..thanxxx – tez

1

int main(int argc, char *argv[]) { 

    char* c1[] = {"Hey","Hello"}; 
    printf("%s",c1[1]); 

} //works fine 

は、なぜ私はC文字列の配列にchar**を指すことはできませんか?

あなたが言ったように、c1は配列です。だからcharへのポインタのの配列としてそれを宣言しなければなりません。 "Hey""Hello"ので

列litteralsあり、各c1[i]ストリングは、匿名列にポインティングあります。だからcharの配列の代わりにcharへのポインタを使うことができます。

charへのポインタ配列を作成するには、char **を使用することはできません。

char** c1 = (char *[]){"Hey","Hello"};

2

変化 "チャー** C1" は、それがchar型へのポインタへのポインタであるコンパイラに伝え、スカラー型(一つの値)です。

値のリストを使用して初期化すると、集計タイプに対してのみ機能します。

0

+0

'char ** c1'にあいまいさはありません。 'char'へのポインタへのポインタです。 (もちろん、上記の両方のポインタが配列の最初の要素になる可能性があります) –

+0

@James Kanze、まあ、私の間違い。それを削除しました。 – Arun

0
int main(int argc, char *argv[]) { 

    char** c1 = {"Hey","Hello"}; 
    printf("%s",c1[1]); 

} //error 

上記のコードでは、2つの文字列のセットへのポインタへのポインタを設定しようとしています。それぞれ "Hey"と "Hello"のアドレスを含む2つのポインタの記憶域はどこですか?どこにもない。

あなたは行うことができます:

char *a = "Hey"; 
char *b = "Hello"; 
char *c[] = { a, b };  // This MAY not compile due to a and b not being compile time constants. 
char **c1 = c; 

(私はそれが実際に必要以上に個々の変数にそれを分割しましたが、私はそれが非常に明確にあなたのコードで「間違った」であるかを説明だと思います)。我々はintにchar *を変更した場合

別の例は次のようになります。

const int a = 1; 
const int b = 2; 

int c[] = { a, b }; 

int *c = { a, b }; // Doesn't work, there is nowhere to store a copy of a and b. 

それは整数を除いて、同じことです。