Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在单独的函数中交换指针_C++_Pointers - Fatal编程技术网

C++ 在单独的函数中交换指针

C++ 在单独的函数中交换指针,c++,pointers,C++,Pointers,我有数据,被限制在一个名为transfer\u data的结构中: struct transfer_data{ std::vector<int> data; } 现在,我的函数固定为始终从一个指针的副本读取数据,而属于另一个指针的数据在第二个线程中处理。数据处理完成后,第二个线程将第一个指针与第二个指针交换 我希望使用这种方法,以避免在第二个线程完成处理时复制太多数据(>1MByte),并避免争用条件(第一个线程正在读取,第二个线程正在同一位置写入等)。因此,通过只复制向量

我有数据,被限制在一个名为
transfer\u data
结构中:

struct transfer_data{
    std::vector<int> data;
}
现在,我的函数固定为始终从一个指针的副本读取数据,而属于另一个指针的数据在第二个线程中处理。数据处理完成后,第二个线程将第一个指针与第二个指针交换

我希望使用这种方法,以避免在第二个线程完成处理时复制太多数据(>1MByte),并避免争用条件(第一个线程正在读取,第二个线程正在同一位置写入等)。因此,通过只复制向量,它应该更快

我的问题是:如何在函数中交换非全局指针?如果我想对变量这样做,我写

void switch(int &a, int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}
为指针编写类似内容时:

void switch(int *a, int *b)
{
    int *tmp = a;
    a = b;
    b = tmp;
}
但是如果我这样做,那么我只在本地切换指针值,而不是全局切换指针值,即从函数返回意味着返回到现状。

如何修复我的函数?或者我的方法有更根本的缺陷吗?

通过使用引用,您可以实现这一点

void switch(transfer_data* &a, transfer_data* &b)
现在可以在函数内部更改作为参数传递的变量。当你在做

void switch(transfer_data* a, transfer_data* b)
存储地址的变量的副本被复制,因此原始变量不受影响。引用基本上是某个变量的别名(昵称),因此通过使用引用,可以在函数体中修改它


如果您想了解编译器是如何实际实现引用的,这里有一个很好的例子

使其通过引用传递,就像对
int
所做的那样<代码>无效开关(int*&a,int*&b)
@songyanyao:这是我第一次看到这样的东西(即
*
&
的组合)。这只会复制指针,而不是指针指向的全部内容?或者通过使用**(指针指向指针)传递给函数。顺便说一下,有一个
std::swap
,现在不需要到处使用tmp中介体。@arc\n不,它不会复制指针对象。准确地说,它也不会复制指针,因为它是引用。无论如何,原理与
int&
相同。
void switch(transfer_data* a, transfer_data* b)