1

関数の引数として配列を渡すことに疑問があります。私のコードは次のとおりです。

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

  void str_cpy(char a[], char b[])
  {
     a = b;
     printf("%s\n", a);
  }

  int main()
  {
     char a[] = "hello";
     char b[] = "world";

     str_cpy(a, b);
     printf ("%s\n", a);
     return 0;
  }

上記のコードでは、配列を関数に渡していますが、参照によって渡されるため、関数定義でbの値をa、つまりa = bに割り当てているため、メイン関数で「world」を出力する必要があります。自分 ..

4

3 に答える 3

3

配列を関数に渡すとき。配列の最初の要素へのポインタとして減衰します。

関数str_cpy()は、渡されたポインターaを別のポインターにポイントするだけbです。元の文字配列の内容は変更されませんa。ポインタaに注意してくださいb。関数に対してローカルです。

また、配列に関する基本的なルールは次のとおりです。
「配列は割り当てできません。配列内の各要素をコピーする必要があります。」

あなたが持っているコードは以下と同等です:

 char a[] = "hello";
 char b[] = "world";

 char *ptr1 = a;
 char *ptr2 = b;

 ptr1 = ptr2;

 printf("[%s]",a);

元の配列の内容を変更するのではなく、配列を指していたポインタを別の配列に向けるだけです。

ある配列の各要素を別の配列にコピーすることは、strcpy()が提供する機能です。単に標準ライブラリが提供する関数を使用する必要があります。

于 2012-12-20T07:04:36.823 に答える
1

関数は次のstr_cpy()ように書くことができます:

void str_cpy(char *a, char *b)
{
    a = b;
    printf("%s\n", a);
}

これは意味的にあなたが書いたものと同等です。あなたが書いたものと私が書いたものの間に操作上の違いはありません。配列は、配列の最初の要素へのポインターとして渡されます。それらは便利に初期化されたローカルポインタ変数です。関数のスコープ内でa、同じ場所をポイントしますが、これはプログラム内bの配列には影響しません。main()

Cで配列をコピーするには、各要素を順番にコピーする必要があります。

void str_cpy(char *a, char *b)
{
    while ((*a++ = *b++) != '\0')
        ;
    printf("%s\n", a);
}
于 2012-12-20T07:05:18.670 に答える
1

あなたはそれを間違っていると解釈しています、それは実際にはpass by valueです。

void str_cpy(char a[], char b[]) // it's same as str_cpy(char *a,char *b)
  {
     a = b;
     printf("%s\n", a); // here it will print "world" because it's a local
              // change in a but actually in main a still contains "hello"
  }

使用しているので<string.h>直接使用できますstrcpy(a,b);

または、次のようにして、charごとにターゲット配列にコピーしてみてください。

str_cpy(char *a,char *b)
{
 while(*b != '\0')
  {
  *a=*b;
  a++;
  b++;
  }
}

ただし、コピーされた文字を保持するのに十分なスペースが配列aにない場合は、問題になる可能性があります。

于 2012-12-20T07:05:24.163 に答える