4

関数に移動するためにchar配列とcharポインターを呼び出す正しい方法はありますが、それは参照によって渡され、そこでも操作されますか?

このようなもの:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void manipulateStrings(char *string1, char *string2[])
{

    strcpy (string1, "Apple");
    strcpy (string2, "Banana");

    printf ("2 string1: %s", string1);
    printf ("2 string2: %s", &string2);

}


int main ()
{
    char *stringA;
    char stringB[1024];

    stringA = (char *) malloc ( 1024 + 1 );

    strcpy (stringA, "Alpha");
    strcpy (stringB, "Bravo");
    printf ("1 stringA: %s", stringA);
    printf ("1 stringB: %s", stringB);

    manipulateStrings(stringA, stringB);

    printf ("3 stringA: %s", stringA);
    printf ("3 stringB: %s", stringB);


    return 0;
}

そのような変数を関数に渡し、char/stringsである変数の値を変更する方法を正しく理解しているかどうかはわかりません

編集:私の質問は-関数内の2つの文字列の値をどのように変更できますか?

4

2 に答える 2

15

Cでは参照渡しのようなものはありません。Cのすべては値で渡されます。これはあなたが必要とする解決策につながります。別のレベルの間接参照を追加します。

ただし、コードには他の問題があります。入力を変更するのではなく、それが参照するものだけを変更するため、ポインタからポインタ(または配列へのポインタ)を渡す必要はありません。文字列をコピーしたい。素晴らしい。そのために必要なのは、十分な量のメモリを指すように初期化されたcharへのポインタです。

将来、入力を変更する必要がある場合(つまり、入力に新しい値を割り当てる必要がある場合)は、ポインターからポインターを使用します。

int mutate(char **input) 
{
    assert(input);
    *input = malloc(some_size);
}

int main(void)
{
    /* p is an uninitialized pointer */
    char *p;
    mutate(&p);
    /* p now points to a valid chunk of memory */
    free(p);
    return 0;
}
于 2013-03-25T03:03:35.607 に答える
0

あなたは現在やっています:

manipulateStrings(stringA, stringB);

そして、内から印刷しますmanipulateStrings。代わりに、正しく実行していることを確認するために、次のようにします。

manipulateStrings(stringA, stringB);
printf ("2 string1: %s", string1);
printf ("2 string2: %s", &string2);

そして、その関数内から印刷しないでください。このようにして、変数が値または参照によってコピーされているかどうかをテストできます。

于 2013-03-25T03:05:43.960 に答える