我想以这种方式在opencl-c调用中交换两个数组:
uint tmp_a[L] = {...};
uint tmp_b[L] = {...};
swap(tmp_a, tmp_b); // (tmp_a, tmp_b) <- (tmp_b, tmp_a)
我想通过交换两个指针的基地址来做到这一点,但不幸的是
void swap(uint num_a[L], uint num_b[L]) {
uint* tmp = num_a;
num_a = num_b;
num_b = tmp;
}
不起作用。
实际上我现在这样做:
for(int i = 0; i < L; ++i) {
const uint tmp = num_a[i];
num_a[i] = num_b[i];
num_b[i] = tmp;
}
我想减少这种不必要的工作。
答案 0 :(得分:2)
数组只是指向一块内存的指针。将数组传递给函数时(如在代码片段中),您将该指针的值传递给函数。将参数传递给函数很像赋值操作。考虑这个简单的例子:
void foo(uint arg[L])
{
arg = NULL;
}
uint bar[L] = {...};
foo(bar);
这基本上与:
相同uint bar[L] = {...};
uint arg[L] = bar;
arg = NULL;
存储在bar
中的指针不受foo
函数内发生的赋值的影响。如果 希望修改bar
函数中foo
中存储的指针,我们应该传递bar
的地址 :
void foo(uint *arg[L])
{
*arg = NULL;
}
uint bar[L] = {...};
foo(&bar);
相当于:
uint data[L] = {...};
uint *arg[L] = &bar;
*arg = NULL;
这一次,arg
指向存储bar
中包含的数据的内存,arg
是指向数组值的指针。这意味着如果我们修改bar
指向的内容,那么我们也会修改void swap(uint *num_a[L], uint *num_b[L])
{
uint *tmp = *num_a;
*num_a = *num_b;
*num_b = tmp;
}
...
uint tmp_a[L] = {...};
uint tmp_b[L] = {...};
swap(&tmp_a, &tmp_b); // (tmp_a, tmp_b) <- (tmp_b, tmp_a)
。
将此应用于您的代码段如下所示:
{{1}}