通过引用传递char数组

时间:2012-10-20 11:02:47

标签: c++ arrays pass-by-reference

我通过引用传递一个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;
}

此致

9 个答案:

答案 0 :(得分:5)

你没有通过引用传递数组(你也不应该,这对你没有好处)。您正在将指针传递给其第一个元素。然后,您将该指针重新指定为指向函数内的其他内容。这对阵列没有影响。如果要更改数组的内容,则需要将数据复制到指针指向的位置。你可以使用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;
}

答案 1 :(得分:5)

您可以通过引用传递指针。为此,您需要以下语法:

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

在函数内部,您将此参数用作简单指针。只有在修改后,这些更改才会在外部显示。

答案 2 :(得分:5)

你可能做的是:

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

}

其转换为:通过引用([..])传递10个([10])个字符(char)的数组((& ..))。

答案 3 :(得分: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;
}

答案 4 :(得分:0)

您正在将指针传递给数组(func (char* array)),然后在函数内部更改指针的值以指向静态字符串。

您需要通过strcpy()将新数据复制到数组中,或者通过引用将指针传递给数组:

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

或者:

strcpy(array, "data");

最好还是改用std::vector<>std::string

答案 5 :(得分:0)

我使用了上面的答案,但我不得不扩展它,所以我可以打印出数组的实际大小:

template<size_t n> void foo(char (&array)[n])
{
    // ...
    std::cout << "array size: " << n << std::endl;
    // ...
}

答案 6 :(得分:0)

引用本机数组是功能非常强大的C ++武器之一。加上模板。这是一个也许不平凡但仍然简单的例子。

// set all element of a given native array reference 
// to the same value
// return the reference to the same array
    template<typename T, size_t N, typename array_type = T[N] >
    inline
        array_type&  /* return reference to T[N] */
        all_val 
         (  T(&arf)[N],  /* arg reference to T[N] */
            T val   )
    {
        // range for() works on native arrays
        // begin(arf) / end(arf)
        // work as expected
        for (auto & elem : arf) {
            elem = val ;
        }
        // array can not be returned by value
        // but this is allowed in standard C++
        // return type is native array reference
        return arf;
    }

使用上述方法时,应该考虑并将返回的类型保留为本机数组引用。

        using charray_type = char[0xF];
        charray_type charray;
        // decaying to pointer to T*
        // you do not want this
        auto pointer_to_char = all_val(charray, '*');
        // you do want this
        // preserving the ref to array
        charray_type& charray_ref = all_val(charray, '*');
        // normal native arr usage
        charray_ref[0] = '*';
        assert(charray[0] == charray_ref[0]);

我认为这对于标准C ++非常简单且独特。

答案 7 :(得分:0)

我知道这篇文章有点老了,但我最近遇到了一种将字符数组作为参考传递并在您的示例中实现它的风格..

我不知道为什么在将 char 数组作为引用传递时,您使用 [0] 作为数组索引,但此代码有效。

我花了很多时间在网上浏览如何做到这一点,所以也许它可以帮助某人

#include <iostream>

using namespace std; 

void  func(char arr[3]);

int main()
{
  char a[3];
  a[0] ='a'; 
  a[1] ='b';
  a[2] ='c';

 //passing the char array as a refrence
 func(&a[0]);

 cout<< "checking the values outside of the func"<<endl;
 cout << a<<endl;
 return 0;
}

void func(char arr[3])
{
   cout<<"Inserting data in array a in the function " <<endl;
   cout << &arr[0]<<endl;
}

将对象作为引用传递背后的主要思想是没有对象的副本,因为这可能会耗尽内存资源。因此,在 char 数组的情况下,您可能有非常大的数组,因此将整个 char 数组 objet 作为参数发送是低效的。这就是为什么我们会通过引用来代替

答案 8 :(得分:-1)

错误第一行 iostream.h ... 第二,你没有在数组中插入任何元素...而且你在函数中传递一个,你必须将数组的地址传递给该函数,但在此之前重写代码以在数组中包含某些东西

相关问题