Как отмечалось выше, основная проблема здесь заключается в том, что по умолчанию параметры передаются как значения, а не как ссылки. Это верно и для Java, однако, все, что передано во фрагменте java, является указателем на массив, а не на сам массив, что делает его «передаваемым по ссылке», однако , Java всегда , передавая по значению !
В C ++ можно передавать как по значению, так и по ссылке. Вы можете передать указатель на объект, который является новым разделом в памяти программы, который содержит расположение к требуемому значению, или вы можете передать ссылку на указанную позицию c в памяти в котором значение сохраняется. Обратите внимание на адреса памяти указателя в следующем фрагменте кода:
#include <iostream>
void foo(int num)
{
std::cout << "The location of pass-by-value num is: " << &num << std::endl;
}
void foo1(int* num)
{
std::cout << "The location of num* is: " << &num << " But its value is :" << num << std::endl;
}
void foo2(int& num)
{
std::cout << "The location of num& is: " << &num << std::endl;
}
int main()
{
int num;
std::cout << "The location of num is: " << &num << std::endl;
foo(num);
foo1(&num);
foo2(num);
}
Вывод этого фрагмента:
The location of num is: 0x7ffce8cceccc
The location of pass-by-value num is: 0x7ffce8ccecac
The location of num* is: 0x7ffce8cceca8 But its value is :0x7ffce8cceccc
The location of num& is: 0x7ffce8cceccc
В foo мы передаем значение целого числа, поэтому мы получаем адрес, отличный от оригинала.
В foo1 мы передаем значение указателя в num. Указатель имеет свою собственную ячейку памяти, и его значение является адресом памяти num.
В foo2 мы передаем ссылку на целое число num, и его адрес памяти точно адрес памяти оригинала, и это true передача по ссылке.
Для редактирования такого объекта вам необходимо передать его по указателю или по ссылке (как правило, передача по ссылке предпочтительнее указателей, когда это возможно).