据我所知,在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
答案 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);
时,你传递的是基地址。