14

参照によってchar配列を渡していますが、関数から戻って配列を出力すると、何も表示されません。私は何が間違っているのですか?

#include <iostream>

using namespace std;

void func(char []);
int main()
{
   char a[100];
   func(a);

   cout << a<<endl;
   return 0;
}

void func(char *array)
{
   array="Inserting data in array a";
   cout << array<<endl;
}

よろしく

4

9 に答える 9

10

おそらくできることは次のとおりです。

void func( char (& array)[10] ) {

}

[..]つまり、10[10]文字 ( ) の配列 ( ) をchar参照 ( ) で渡す( (& ..))。

于 2012-10-20T11:20:07.833 に答える
9

あなたは配列を参照渡ししていません(そうすべきではありません。ここでは役に立たないでしょう)。最初の要素へのポインターを渡しています。次に、そのポインターを再割り当てして、関数内の別の何かを指すようにします。これはアレイには影響しません。配列の内容を変更する場合は、ポインターが指す場所にデータをコピーする必要があります。そのために strcpy などを使用できます。

strcpy(array, "Inserting data in array a");

補足ですが、非常に重要なコメントです。このようなことを C++ で処理する必要はもうありません。これが C で行う方法です。C++ で行う方法は次のとおりです。

#include <string>
#include <iostream>

void func(std::string & str)
{
    str = "Inserting data into the string";
    std::cout << str << std::endl;
}

int main()
{
    std::string a;
    func(a);
    std::cout << a << std::endl;
}
于 2012-10-20T11:07:49.320 に答える
5

参照によってポインタを渡すことができます。これを行うには、次の構文が必要です。

void func(char *&array)
{
    // ....
}

関数内では、このパラメーターを単純なポインターとして使用します。値が変更された場合、これらの変更は外部に表示されます。

于 2012-10-20T11:09:41.203 に答える
2

次のことを試してください。

void function(char* MyArray)
{
    MyArray = "Hello World";
    std::cout << "Address of MyArray inside function: " << (void*)MyArray << std::endl;
}

int main()
{
    char MyArray[10];
    std::cout << "Address of MyArray outside function: " << (void*)MyArray << std::endl;
    function(MyArray);
    std::cout << "Address of MyArray outside function: " << (void*)MyArray << std::endl;

    std::cin.get();
    return 0;
}

これにより、配列へのポインターが関数内のコピーに過ぎないことがわかります。「Hello World」を割り当てると、コピーのアドレスのみが変更され、メイン関数の配列のアドレスは変更されません。

この例は、関数内にポインターのコピーがないため、実際に機能します。

void function(char** MyArray)
{
    *MyArray = "Hello World";
    std::cout << "Address of MyArray inside function: " << (void*)*MyArray << std::endl;
}

int main()
{
    char* MyArray = 0;
    std::cout << "Address of MyArray outside function: " << (void*)MyArray << std::endl;
    function(&MyArray);
    std::cout << "Address of MyArray outside function: " << (void*)MyArray << std::endl;

    std::cin.get();
    return 0;
}

しかし、これはまだ悪いスタイルです。文字配列を操作するときは、次のようにする必要があります。

void function(char* MyArray)
{
    strcpy(MyArray, "Hello World");
    std::cout << "Address of MyArray inside function: " << (void*)MyArray << std::endl;
}

int main()
{
    char* MyArray = 0;
    MyArray = new char[15];

    std::cout << "Address of MyArray outside function: " << (void*)MyArray << std::endl;
    function(MyArray);
    std::cout << "Address of MyArray outside function: " << (void*)MyArray << std::endl;

    delete [] MyArray;

    std::cin.get();
    return 0;
 } 

しかし、他の人が述べたように、文字配列を使用する代わりに、 std::string を使用して参照渡しします。文字配列は std::string と比較して安全ではないためです。このような:

void function(std::string& MyString)
{
    MyString = "Hello World";
}

int main()
{
    std::string MyString;
    function(MyString);

    std::cin.get();
    return 0;
}
于 2012-10-20T11:47:58.783 に答える
0

ポインターを配列 ( ) に渡し、func (char* array)関数内でポインターの値を変更して静的文字列を指すようにします。

を使用して新しいデータを配列にコピーするかstrcpy()、参照によって配列へのポインターを渡す必要があります。

void func(char*& array); // reference to pointer

または:

strcpy(array, "data");

std::vector<>またはstd::string代わりに使用することをお勧めします。

于 2012-10-20T11:10:33.793 に答える
-1

エラーの最初の行iostream.h ...そして2番目に、配列に要素を挿入していません...そして関数にaを渡している場合、配列のアドレスをその関数に渡す必要がありますが、その前にコードを次のように書き直しますあなたの配列に何かがあります

于 2012-10-20T11:46:29.950 に答える