0
void changeStr(char *str)
{
    str = "D";
}

void changeStr(char **str)
{
    *str = "S";
}

    char str[] = "Good";
    changeStr(str); 
    cout<<str<<endl;
    char *p = str;
    //*p = 'j';
    changeStr(&p);
    cout<<str<<endl;

str[]その配列の値を変更しようとしています。返品なし!

changeStr最初は、のポインタを渡してその値を変更するだけだと思いますstrが、実際には変更されませんでした。

2番目はポインタのポインタを使用していますが、動作しません。

4

4 に答える 4

6

ステップバイステップでそれを取りましょう。

char str[] = "Good";

次の内容の5文字の長さの文字の配列を作成しています。

{ 'G', 'o', 'o', 'd', '\0' }

changeStr(str);

ここでは、その配列を関数に渡します。配列はポインタに減衰するため、この呼び出しは完全に問題ありません。

void changeStr(char *str)
{
    str = "D";
}

さて、ここに最初の問題があります。あなたはおそらく混乱している"D"'D'。配列の最初の文字を変更する場合は、次の方法で行う必要があります。

str[0] = 'D';

これはうまくいくでしょう。ポインタは、配列自体ではなく、配列の先頭へのポインタを保持するローカル変数であるため、ポインタを変更しても何も起こりません。配列のコンテンツ全体を。だけに置き換える場合は、{ 'D', '\0' }を使用する必要がありますstrcpy

strcpy(str,"D");

それでは、最後の部分を確認しましょう。ここでは、物事を少し混ぜ合わせます。

char *p = str;
changeStr(&p);

配列の先頭を指す新しい変数を作成し、その変数へのポインターを次の関数に渡します。

void changeStr(char **str)
{
    *str = "S";
}

これは実際に渡された元の変数を変更しますが、これはp配列ではないことを忘れないでください。あなたがしたことは、pポイントを変更することです。定数を指すようになりました"S"

于 2012-11-12T08:48:27.133 に答える
1

関数の最初のバージョンではchangeStr、引数strはローカル変数と見なされ、すべてのローカル変数の変更は実際の関数内でのみ変更されます。

2番目のバージョンは、文字列を参照として渡します。&基本的に、これは、変数を仕様の参照として渡すように指定した場合に発生します。

void changeStr(char *&str)

内部的に、コンパイラーは参照をポインターとして渡します。

于 2012-11-12T08:36:35.170 に答える
0

strの値を変更するには、参照によって値を渡す必要があります。

それは次のようでなければなりません

void changeStr(char* &str)

これにより、変数が参照によって渡されるようになります。したがって、関数で変数に変更を加えると、グローバルに変更されます。

于 2012-11-12T08:45:10.843 に答える
0

ポインタであっても、変数に文字列を格納するために代入演算子を使用しないでください。string.hを含めた後にstrcpyを使用します

void changeStr(char *str)
{
    strcpy(str, "D");
}

これにより、strポインタが指しているデータが変更されます...関数呼び出しが行われたスコープでも...

于 2012-11-12T09:34:09.240 に答える