【问题标题】:What is ** in C++C++中的**是什么
【发布时间】:2010-08-26 06:42:52
【问题描述】:

我目前正在阅读一些 C++ 源代码,我遇到了这个:

 double **out;
 // ... lots of code here 

 // allocate memory for out
 out = new double*[num];

不完全确定它的作用或含义。它是一个指针……指向另一个指针吗?

还有以下几种:

 double ***weight;

 // allocate memory for weight
 weight = new double**[numl];

我很困惑:P,感谢任何帮助。

【问题讨论】:

  • 你应该使用帖子编辑器的代码格式化功能,使帖子更具可读性

标签: c++ c pointers memory


【解决方案1】:

new double*[num] 是一个双指针数组,即数组的每个元素都是一个double*。您可以使用out[i] = new double; 为每个元素分配内存,同样weightdouble** 的数组。您可以使用new double*[num] 为每个权重元素分配内存(如果它应该是double* 的数组)

【讨论】:

  • +1,最佳答案。但是,单独分配每个 double 可能不是一个好主意,尤其是对于科学应用程序。最好分配一个双精度数组,并让所有指针指向该数组的元素。
【解决方案2】:

它是一个指向 double 的指针。或指向双精度的指针数组。或者如果每个指针本身都分配数组,它可能是一个矩阵。

out = new double*[num]; // array of pointers

现在取决于out[0] 是否像这样分配:

out[0] = new double; // one double

或者像这样:

out[0] = new double[num]; // now you've got a matrix

【讨论】:

    【解决方案3】:

    其实写

    double*[] out;
    

    在 C/C++ 中等于

    double** out;
    

    它意味着一个指向双精度的指针数组。或指向双精度指针的指针。因为数组只不过是一个指针。所以这本质上是一个二维数组。

    你也可以写

    double[][] out;
    

    同样,添加另一个指针级别会为您的数组添加另一个维度。 所以

    double ***weight;
    

    实际上是一个指向三维数组的指针。

    【讨论】:

    • 没有。 double*[] out; 是语法错误。 double* out[]; 将声明 double* 的数组,而不是指针。数组和指针是不同的类型;例如,您不能分配给数组,因此out = new double*[num]; 将无效。
    【解决方案4】:

    基本上,您的两个代码片段都分配指针数组。对于分配,它与什么无关。只有类型检查才需要正确的声明。 Square bracjets 应单独阅读,仅表示它是数组。

    将以下代码视为快速示例:

    #include <stdio.h>
    
    int main()
    {
        unsigned num = 10;
        double **p1, ***p2;
    
        p1 = new double*[num];
        p2 = new double**[num];
    
        printf("%d\n", sizeof(p1));
        printf("%d\n", sizeof(p2));
    
        delete [] p1;
        delete [] p2;
    
        return 0;
    }
    

    是的,两者都只是指针。并且分配的内存是 sizeof(double*) * num。

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2020-08-08
      • 2011-05-28
      • 2011-03-26
      • 2012-07-12
      相关资源
      最近更新 更多