为什么cudaMalloc()参数是二级指针

类似于这个例子

#include <iostream>
using namespace std;

void sw(int a,int b)
{
        int tmp=a;
        a=b;
        b=tmp;
}

void sw1(int* a,int* b)
{
        int tmp;
        tmp=*a;
        *a=*b;
        *b=tmp;
}
int main(void)
{
        int a,b;
        a=1;
        b=2;
        sw(a,b);
        cout<<a<<b<<endl;
        sw1(&a,&b);
        cout<<a<<b<<endl;
        return 0;
}

直接传值,函数对形参值的修改无法传出,因为形参的是在栈上创建的,函数结束后生命周期就结束了,所以想将修改的值传出来,就要传入要修改值的指针

同样,如果我想将device上分配的内存地址通过形参传出来,传入参数的形式就是指针的指针,也就是二级指针。

为什么一级指针不行呢?因为指针的数据类型是整形,如果我在device上分配的空间是float,传入的参数肯定是float,如果使用一级指针float*,那么我只能修改指针中的数据float,float跟我们想传出来的地址的数据类型(int)不一样,所以传入参数必须是二级指针。

当传入的是二级指针时,比如float**,我想将gpu上分配的float类型的地址传出来,我可以将它赋值给float*,float*的数据类型就是指针类型了

无情的摸鱼机器
原文地址:https://www.cnblogs.com/wangtianning1223/p/15770219.html