将新数组分配给引用变量
assigning new array to reference variable
void byReference(int (&p)[3]){
int q[3] = {8, 9, 10};
p = q;
}
我想编写可以用新数组重新分配 p 的函数。我不确定我们是否可以这样做。
我的目标:
我想更改原始数组,就像我们通过引用调用交换两个数字一样。
编辑:
我的工作解决方案:
void byReference(int*& p){
int* q = new int[2];
q[0] = 8;
q[1] = 9;
p = q;
}
int main(){
int *x = new int[2];
x[0] = 1;
x[1] = 2;
byReference(x);
return 0;
}
在 c++ 中,建议对固定大小的数组使用 std::array
,对动态大小的数组使用 std::vector
。
两者都可以通过引用传递,通过函数修改。
这需要函数 声明参数由引用 使用 &
符号传递。
参见下面的示例:
#include <array>
#include <vector>
// Get an array (with a fixed size of 3) by refernce and modify it:
void ModifyStdArray(std::array<int, 3> & a) {
a = std::array<int, 3>{8, 9, 10};
// or:
a[0] = 8;
a[1] = 9;
// etc.
}
// Get a vector by refernce and modify it:
void ModifyStdVector(std::vector<int> & v) {
v = std::vector<int>{ 1,2,3,4 };
// or:
v.clear();
v.push_back(1);
v.push_back(2);
// etc.
}
int main()
{
std::array<int, 3> a1;
// Pass a1 by reference:
ModifyStdArray(a1);
// Here a1 will be modified.
std::vector<int> v1;
// Pass v1 by reference:
ModifyStdVector(v1);
// Here v1 will be modified.
}
你可以这样做:
#include <iostream>
#include <array>
#include <algorithm>
// with std::array
void byReference( std::array<int, 3>& p )
{
const std::array<int, 3> q { 8, 9, 10 };
std::copy_n( std::begin( q ), std::size( p ), std::begin( p ) ); // copy q to p
}
// with C-style arrays
void byReference( int (&p)[ 3 ] )
{
const int q[ 3 ] { 8, 9, 10 };
std::copy_n( std::begin( q ), std::size( p ), std::begin( p ) ); // copy q to p
}
int main( )
{
std::array<int, 3> arr;
// int arr[ 3 ]; // or this one
byReference( arr );
std::cout << "The array is: ";
std::copy_n( std::begin( arr ), std::size( arr ),
std::ostream_iterator<int>( std::cout, " " ) ); // copy the elements of arr to
// the stdout (aka print them)
std::cout << '\n';
}
输出:
The array is: 8 9 10
不能通过赋值复制数组。您可以使用 std::copy
void byReference(int(&p)[3]) {
int q[3] = { 8, 9, 10 };
// p = q;
std::copy(&q[0], &q[3], &p[0]);
}
.....
int a[3] = { 1, 2, 3 };
byReference(a);
// a now 8,9,10
void byReference(int (&p)[3]){
int q[3] = {8, 9, 10};
p = q;
}
我想编写可以用新数组重新分配 p 的函数。我不确定我们是否可以这样做。
我的目标: 我想更改原始数组,就像我们通过引用调用交换两个数字一样。
编辑:
我的工作解决方案:
void byReference(int*& p){
int* q = new int[2];
q[0] = 8;
q[1] = 9;
p = q;
}
int main(){
int *x = new int[2];
x[0] = 1;
x[1] = 2;
byReference(x);
return 0;
}
在 c++ 中,建议对固定大小的数组使用 std::array
,对动态大小的数组使用 std::vector
。
两者都可以通过引用传递,通过函数修改。
这需要函数 声明参数由引用 使用 &
符号传递。
参见下面的示例:
#include <array>
#include <vector>
// Get an array (with a fixed size of 3) by refernce and modify it:
void ModifyStdArray(std::array<int, 3> & a) {
a = std::array<int, 3>{8, 9, 10};
// or:
a[0] = 8;
a[1] = 9;
// etc.
}
// Get a vector by refernce and modify it:
void ModifyStdVector(std::vector<int> & v) {
v = std::vector<int>{ 1,2,3,4 };
// or:
v.clear();
v.push_back(1);
v.push_back(2);
// etc.
}
int main()
{
std::array<int, 3> a1;
// Pass a1 by reference:
ModifyStdArray(a1);
// Here a1 will be modified.
std::vector<int> v1;
// Pass v1 by reference:
ModifyStdVector(v1);
// Here v1 will be modified.
}
你可以这样做:
#include <iostream>
#include <array>
#include <algorithm>
// with std::array
void byReference( std::array<int, 3>& p )
{
const std::array<int, 3> q { 8, 9, 10 };
std::copy_n( std::begin( q ), std::size( p ), std::begin( p ) ); // copy q to p
}
// with C-style arrays
void byReference( int (&p)[ 3 ] )
{
const int q[ 3 ] { 8, 9, 10 };
std::copy_n( std::begin( q ), std::size( p ), std::begin( p ) ); // copy q to p
}
int main( )
{
std::array<int, 3> arr;
// int arr[ 3 ]; // or this one
byReference( arr );
std::cout << "The array is: ";
std::copy_n( std::begin( arr ), std::size( arr ),
std::ostream_iterator<int>( std::cout, " " ) ); // copy the elements of arr to
// the stdout (aka print them)
std::cout << '\n';
}
输出:
The array is: 8 9 10
不能通过赋值复制数组。您可以使用 std::copy
void byReference(int(&p)[3]) {
int q[3] = { 8, 9, 10 };
// p = q;
std::copy(&q[0], &q[3], &p[0]);
}
.....
int a[3] = { 1, 2, 3 };
byReference(a);
// a now 8,9,10