数组传递给C ++中的方法

时间:2014-03-01 09:56:37

标签: c++ arrays

据我所知,在C ++中,当你将一个非指针对象传递给一个方法时,它会在方法中复制它。但是在我下面的程序中,我传递了一个副本,但我的方法实际上编辑了原始字符数组。这为什么有效? :/

#include <iostream>
#include <string>
 void Reverse(char s[], int sizeOfArray)
{
    for (int i = 0 ; i < sizeOfArray; i++)
    {
        s[i] = 'f';
    }

}
int main()
{
    char c[3] = {'g','t','r'};
    Reverse(c,3);
    for (int t = 0 ; t < 3; t++)
   {
      std::cout << c[t];
   }
    return 0;
 }

注:

输出为fff

5 个答案:

答案 0 :(得分:2)

您无法通过将数组传递给函数来复制它们。数组“衰减”成指针。通过打印变量'typeid:

来检查自己
#include <iostream>
#include <string>
void Reverse(char s[], int sizeOfArray)
{
    std::cout << typeid(s).name() << "\n";
    for (int i = 0 ; i < sizeOfArray; i++)
    {
        s[i] = 'f';
    }

}
int main()
{
    char c[3] = {'g','t','r'};
    std::cout << typeid(c).name() << "\n";
    Reverse(c,3);
    for (int t = 0 ; t < 3; t++)
   {
      std::cout << c[t];
   }
    return 0;
 }

结果:

char [3]
char *

故事的道德:

使用std::vector


编辑:我应该提一下,typeid name 的确切结果是实现定义的。 “char [3]”和“char *”是我在VC 2013中得到的。但是当然,每个编译器的基本问题都是相同的。

答案 1 :(得分:0)

void Reverse(char s [],int sizeOfArray)

反向(C,3);

&gt;按值调用

&gt;按引用方式调用

这里你通过引用操作进行调用,这意味着你将c的地址传递给int s []

  

您正在将c的引用传递给反向函数。这称为按引用调用而不是按值调用。这就是为什么反向功能覆盖原始输入

答案 2 :(得分:0)

因为char s[]实际上是char *指向数组的第一个元素。 这意味着您的函数Reverse获取第一个arg指针,但不是数组的副本。

如果要获得副本,首先应使用memcpy并传递新的(复制)数组。

答案 3 :(得分:0)

无法通过复制传递C数组。

可以通过引用传递为void Reverse(char (&a)[3])
或者通过其衰减的指针void Reverse(char a[], int size) (与void Reverse(char* a, int size))相同。

您可以使用std::array(C ++ 11)来获得更直观的行为。

答案 4 :(得分:-1)

如果声明一个数组,那么该变量将保存该数组的基地址,因此char c[3]表示c保存数组c[3]的基址。

所以,当你实际传递Reverse(c,3);时,你传递的是基地址。