1

メイン以外の関数で連結された文字列がメイン関数で出力された理由を理解するのが困難です。つまり、このプログラムは、2 つの char 配列の連結を説明するために設計されました。

#include <stdio.h>

void concat(char result[], const char str1[], int n1, const char str2[], int n2)
{
    int i, j;

    // copy str1 to result
    for (i = 0; i < n1; ++i)
    {
        result[i] = str1[i];
    }
    // copy str2 to result
    for (j = 0; j < n2; ++j)
    {
        result[n1 + j] = str2[j];
    }
}

int main(void)
{
    void concat(char result[], const char str1[], int n1, const char str2[], int n2);
    const char s1[5] = { 'T', 'e', 's', 't', ' ' };
    const char s2[6] = { 'w', 'o', 'r', 'k', 's', '.' };
    char s3[11];
    int i;

    concat(s3, s1, 5, s2, 6);

    for (i = 0; i < 11; ++i)
    {
        printf("%c", s3[i]);    // Here is what I do not understand: how was the s3 array
                                // accessible since it was not returned from concat
    }
    printf("\n");

    return 0;
}

私が理解しているように、関数が値を返すか、配列/変数がグローバルに宣言されていない限り (これは避けるべきものです: 狭いスコープが必要です)、配列/変数はメインに「見える」べきではありませんか? これは正しくありませんか?メインが印刷するために使用する関数からs3を返す必要があると思ったからです。

4

3 に答える 3

1

C の関数は、パラメーターに値渡しを使用します。concat の最初の引数として s3 を渡すと、値「配列 s3 のアドレス」が渡されます。関数 concat は、result という名前の引数の場所としてアドレスを使用します。この関数は、値をメモリ ロケーション result (呼び出し関数の s3 の別の名前) にコピーします。

関数が関数 concat の最後に到達すると、s3 の配列が変更されています。

これを説明するために、concat を呼び出す前に s3 のアドレスを出力します。

printf("s3 address: %x\n",s3);

そして、concat 内の結果のアドレスを出力し、

printf("result address: %x\n",result);

s3 として渡す値は s3[] のアドレスであり、これは char[11] メモリ バッファへの参照です。

于 2013-10-30T01:59:25.270 に答える
1

配列内の値は、配列が表示されている場所であればどこでもアクセスおよび変更できます。この場合、「concat」メソッド内で配列を変更しています。配列はこれらの値への参照であるため、この新しい配列を返さない間、配列の要素を変更すると、配列が参照されているすべての場所で変更されます。

于 2013-10-30T01:45:52.477 に答える