首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何交换两个固定大小的opencl-c数组?

如何交换两个固定大小的opencl-c数组?
EN

Stack Overflow用户
提问于 2014-07-20 09:32:29
回答 1查看 767关注 0票数 0

我想以这种方式交换opencl-c调用中的两个数组:

代码语言:javascript
复制
uint tmp_a[L] = {...};
uint tmp_b[L] = {...};
swap(tmp_a, tmp_b); // (tmp_a, tmp_b) <- (tmp_b, tmp_a)

我想通过交换两个指针的基址来实现,但不幸的是

代码语言:javascript
复制
void swap(uint num_a[L], uint num_b[L]) {
    uint* tmp = num_a;
    num_a = num_b;
    num_b = tmp;
}

不起作用。

实际上,我现在是这样做的:

代码语言:javascript
复制
for(int i = 0; i < L; ++i) {
        const uint tmp = num_a[i];
        num_a[i] = num_b[i];
        num_b[i] = tmp;
}

我想减少这项不必要的工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-20 09:48:14

数组只是一个指向内存块的指针。当您将数组传递给函数时(如代码片段中所示),您将该指针的值传递给该函数。将参数传递给函数很像赋值操作。考虑一下这个简单的例子:

代码语言:javascript
复制
void foo(uint arg[L])
{
  arg = NULL;
}

uint bar[L] = {...};
foo(bar);

这基本上与以下几点相同:

代码语言:javascript
复制
uint bar[L] = {...};
uint arg[L] = bar;
arg = NULL;

存储在bar中的指针没有受到在foo函数中发生的赋值的影响。如果我们确实想修改存储在bar中的foo函数中的指针,我们应该传递bar的地址。

代码语言:javascript
复制
void foo(uint *arg[L])
{
  *arg = NULL;
}

uint bar[L] = {...};
foo(&bar);

相当于:

代码语言:javascript
复制
uint data[L] = {...};
uint *arg[L] = &bar;
*arg = NULL;

这一次,arg指向存储bar中包含的数据的内存,该内存是指向数组值的指针。这意味着,如果我们修改arg所指向的内容,那么我们也将修改bar

将其应用于代码片段如下所示:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24849163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档