我想以这种方式交换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;
}我想减少这项不必要的工作。
发布于 2014-07-20 09:48:14
数组只是一个指向内存块的指针。当您将数组传递给函数时(如代码片段中所示),您将该指针的值传递给该函数。将参数传递给函数很像赋值操作。考虑一下这个简单的例子:
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)https://stackoverflow.com/questions/24849163
复制相似问题