如何通过引用 C++ 传递动态数组
How to pass Dynamic Array by reference C++
我无法理解如何在 C++ 中通过引用传递动态数组。
我在这个独立的小代码示例中重现了这个问题:
#include <iostream>
using namespace std;
void defineArray(int*);
int main()
{
int * myArray;
defineArray(myArray);
/** CAUSES SEG FAULT*/
//cout<<(*(myArray)); //desired output is 0
return 0;
}
void defineArray(int*myArray)
{
int sizeOfArray;
cout<<"How big do you want your array:";
cin>>sizeOfArray;
/** Dynamically allocate array with user-specified size*/
myArray=new int [sizeOfArray];
/** Define Values for our array*/
for(int i = 0; i < sizeOfArray; i++)
{
(*(myArray+i))=i;
cout<<(*(myArray+i));
}
}
myArray
是传值本身,对myArray
的任何修改(如myArray=new int [sizeOfArray];
)与原变量无关,myArray
在main()
仍然悬空。
要使其通过引用传递,请更改
void defineArray(int*myArray)
至
void defineArray(int*& myArray)
这个解决方案非常复杂。您不需要 new[]
、指针甚至引用参数。在 C++ 中,"dynamic arrays" 的概念最好用 std::vector
表示,您可以将其用作 return 值:
#include <iostream>
#include <vector>
std::vector<int> defineArray();
int main()
{
auto myArray = defineArray();
if (!myArray.empty())
{
std::cout << myArray[0] << "\n";;
}
}
std::vector<int> defineArray()
{
int sizeOfArray;
std::cout << "How big do you want your array:";
std::cin >> sizeOfArray;
std::vector<int> myArray;
for (int i = 0; i < sizeOfArray; i++)
{
myArray.push_back(i);
std::cout<< myArray[i] << "\n";
}
return myArray;
}
push_back
将足够智能地工作并且不会一直分配新内存。如果这仍然让您担心,那么您可以在添加元素之前调用 reserve
。
我无法理解如何在 C++ 中通过引用传递动态数组。
我在这个独立的小代码示例中重现了这个问题:
#include <iostream>
using namespace std;
void defineArray(int*);
int main()
{
int * myArray;
defineArray(myArray);
/** CAUSES SEG FAULT*/
//cout<<(*(myArray)); //desired output is 0
return 0;
}
void defineArray(int*myArray)
{
int sizeOfArray;
cout<<"How big do you want your array:";
cin>>sizeOfArray;
/** Dynamically allocate array with user-specified size*/
myArray=new int [sizeOfArray];
/** Define Values for our array*/
for(int i = 0; i < sizeOfArray; i++)
{
(*(myArray+i))=i;
cout<<(*(myArray+i));
}
}
myArray
是传值本身,对myArray
的任何修改(如myArray=new int [sizeOfArray];
)与原变量无关,myArray
在main()
仍然悬空。
要使其通过引用传递,请更改
void defineArray(int*myArray)
至
void defineArray(int*& myArray)
这个解决方案非常复杂。您不需要 new[]
、指针甚至引用参数。在 C++ 中,"dynamic arrays" 的概念最好用 std::vector
表示,您可以将其用作 return 值:
#include <iostream>
#include <vector>
std::vector<int> defineArray();
int main()
{
auto myArray = defineArray();
if (!myArray.empty())
{
std::cout << myArray[0] << "\n";;
}
}
std::vector<int> defineArray()
{
int sizeOfArray;
std::cout << "How big do you want your array:";
std::cin >> sizeOfArray;
std::vector<int> myArray;
for (int i = 0; i < sizeOfArray; i++)
{
myArray.push_back(i);
std::cout<< myArray[i] << "\n";
}
return myArray;
}
push_back
将足够智能地工作并且不会一直分配新内存。如果这仍然让您担心,那么您可以在添加元素之前调用 reserve
。