我想将一个数组传递给一个函数,然后在所述函数中将该数组变量完全指向一个新地址。
我意识到数组在传递给函数时表现为指向第一个元素的地址的指针,那么为什么在main中我的数组变量的地址不会改变呢?
#include <iostream>
using namespace std;
void passArrayByReference(int * array) { //passing array as. pointer should let us modify it's address, correct?
cout << "Address of array in function is: " << array << endl;
int * localArray = new int [2];
//put some dummy values in our localArray
localArray[0] = 9;
localArray[1] = 9;
array = localArray;
cout << "Address of array in function is now: " << array << endl;
}
int main()
{
int * array = new int [2];
int totalElements = 2;
//put some initial values into our dynamic 1D array
array[0] = 0;
array[1] = 1;
//print our initial values
for(int i = 0; i < totalElements; i++)
cout << array[i] << endl;
cout << "Address of array in main: " << array << endl;
passArrayByReference(array);
cout << "Address of array in main: " << array << endl;
return 0;
}
答案 0 :(得分:2)
你走在正确的轨道上,但你只需要加入'&amp;'函数头中的符号。 '&amp;' symbol用于通过引用传递参数,而不是按值传递。
在这种情况下,您将通过引用将地址传递给数组的第一个元素,这意味着您可以在函数中修改该地址,并且更改将反映在主函数中。
#include <iostream>
using namespace std;
void passArrayByReference(int * &array) {
cout << "Address of array in function is: " << array << endl;
int * localArray = new int [2];
//put some dummy values in our localArray
localArray[0] = 9;
localArray[1] = 9;
array = localArray;
cout << "Address of array in function is now: " << array << endl;
}
int main()
{
int * array = new int [2];
int totalElements = 2;
//put some initial values into our dynamic 1D array
array[0] = 0;
array[1] = 1;
//print our initial values
for(int i = 0; i < totalElements; i++)
cout << array[i] << endl;
cout << "Address of array in main is: " << array << endl;
passArrayByReference(array);
cout << "Address of array in main is now: " << array << endl;
//now print the values of our 'new' array
cout << "The values of array are now:" << endl;
for(int i = 0; i < totalElements; i++)
cout << array[i] << endl;
return 0;
}
答案 1 :(得分:1)
指针也是变量。
这就是为什么您需要将array
作为对passArrayByReference
的引用,以便您不要修改它的副本。
void passArrayByReference(int *&array)
答案 2 :(得分:1)
首先,您必须通过指针或引用传递指针以对其进行持久更改 - 这是更改原始指针,而不仅仅是复制在函数体中:
void passArrayByReference(int *&array) {
//...
array = new_address;
std::cout << "Address of array in function is now: " << array << std::endl;
}
// and here it is the same
第二,您应该分配有效地址new_address
并处理array
在进入函数之前引用的内存,以避免内存泄漏。