2012-02-27 26 views
0

Cで引数として渡された変数の値を変更する方法はありますか?引数として渡された変数の値を変更するには?

void foo(char *foo, int baa){ 
    if(baa) { 
     foo = "ab"; 
    } else { 
     foo = "cb"; 
    } 
} 

およびコール: 私はこの試みた

char *x = "baa"; 
foo(x, 1); 
printf("%s\n", x); 

を、それはbaa理由を出力しますか?ありがとうございます。

+4

が重複する可能性(http://stackoverflow.com/questions/4016765/tutorial-on-c-pointers) –

+0

もし(BAA) ?それはブール値ではなく、これは法的にcであるのですか? – Induster

+0

@Induster Cにブール型はありません。すべてのブール論理はintで行われます。 – Phonon

答えて

10

char**charポインターへのポインター)。

したがってfoo()のように書き換えることになります。foo()を呼び出すときに今、あなたはアドレス演算子を使用してxからポインタ(&)を渡します

void foo(char **foo /* changed */, int baa) 
{ 
    if(baa) 
    { 
     *foo = "ab"; /* changed */ 
    } 
    else 
    { 
     *foo = "cb"; /* changed */ 
    } 
} 

foo(&x, 1); 

あなたの間違ったスニペットがbaaを印刷する理由は、単に新しい値をlocに割り当てるためですal変数char *foo、これはxとは無関係です。したがって、xの値は変更されません。

+0

@Jesse:いいえ、私はいません。これは単純に 'x'を別の文字列リテラルに向けます。 – AusCBloke

+0

あなたは正しいです、私のコメントを撤回します(ideone.comは私の混乱につながったランタイムエラーを出していました)。 –

+0

@Jesse:心配はいりません。 – AusCBloke

0

関数fooでは、引数fooをローカルでのみ変更しています。関数fooが終了すると、引数xはまだxです。あなたはfooでそれを変更しませんでした。あなたはそれをコピーしてfooを呼び出しただけです。

でも@Greg Hewgillコメントをご覧ください。あなたはchar*ポイントは、したがって、あなたは間接の1以上のレベルでfoo()で引数を受け入れるために必要になるだろう場所を変更したいとしている

4

は複数の問題があります。

void foo(char *foo, int baa) 
{ 
    if (baa) 
     foo = "ab"; 
    else 
     foo = "cb"; 
} 

このコードは、ローカルポインタを変更しますが、それを何もしません。周りの文字列をコピーするには、同じインターフェイスを保つためにstrcpy()を使用する必要があります。

void foo(char *foo, int baa) 
{ 
    if (baa) 
     strcpy(foo, "ab"); 
    else 
     strcpy(foo, "cb"); 
} 

しかし、それを行う前に、あなたは変更可能メモリでファンクションポイントでそのfooを確保する必要があると思います。呼び出し元のコードのことを確認するように変更する必要があります

char x[] = "baa"; 
foo(x, 1); 
printf("%s\n", x); 

を別の方法として、あなたはポインタとしてxを維持し、機能インタフェース修正することができます

void foo(char **foo, int baa) 
{ 
    if (baa) 
     *foo = "ab"; 
    else 
     *foo = "cb"; 
} 

、呼び出しシーケンス:

char *x = "baa"; 
foo(&x, 1); 
printf("%s\n", x); 

どちらのメカニズムも機能しますが、異なる方法で機能します。それぞれにさまざまな問題があります。ただ一つの「これはそれよりも良い」決定ではない。表示されるコードフラグメントの範囲外の状況によります。

2

質問は一般的な方法でタイトルが付けられています。あなたはすでにあなたの特定の問題に対する答えを得ています。私は、intdoubleの種類の例をいくつか追加します。

#include <stdio.h> 

void incrementInt(int* in, int inc) 
{ 
    *in += inc; 
} 

void incrementDouble(double* in, double inc) 
{ 
    *in += inc; 
} 

int main() 
{ 
    int i = 10; 
    double d = 10.2; 

    printf("i: %d, d: %lf\n", i, d); 

    incrementInt(&i, 20); 
    incrementDouble(&d, 9.7); 

    printf("i: %d, d: %lf\n", i, d); 
} 

出力:[Cポインタのチュートリアル]の

i: 10, d: 10.200000 
i: 30, d: 19.900000 
関連する問題