**在C语言中是什么意思?

What does ** mean in C?

我有一个示例 C 程序,我正试图理解它。以下是源代码的功能摘录:

double** Make2DDoubleArray(int arraySizeX, int arraySizeY)
{
  double** theArray;
  theArray = (double**) malloc(arraySizeX*sizeof(double*));
  int i = 0;

  for (i = 0; i < arraySizeX; i++)
    theArray[i] = (double*) malloc(arraySizeY*sizeof(double));

  return theArray;
}

我的问题是 return 类型中的 ** 有什么意义。我知道 * 通常用作 pointer。我知道它也可以用来dereference指针。

这让我觉得 double** 是一个双精度值,因为它本质上是引用的解除引用。我的想法正确吗?如果不是,有人可以解释一下 ** 在这个例子中的用法吗?

在这种情况下,double表示双精度类型的变量。

double*表示指向double变量的指针。

double**表示指向double变量的指针。

就您发布的函数而言,它用于创建一种二维双精度数组。也就是说,一个指向双指针数组的指针,每个指针都指向一个指针数组。

some_type*

是指向 some_type 的指针。所以

some_type**

是指向some_type的指针。

一个典型的用途是(模拟)二维数组。

在你的例子中,第一个 malloc 为指向双精度数组的指针保留内存。第二个 malloc 为双精度数组保留内存。这样你就分配了可以像二维数组一样使用的内存。

这里有一个更笼统的答案:spiral rule。对于这个特定的例子:

      +-----------+
      |+--------+ |
      ||  +---+ | |
      ||  ^   | | |
double** foo; | | |
   ^  |^      | | |
   |  |+------+ | |
   |  +---------+ |
   +--------------+

读作“\"foo\" 是指向 double 的指针。”

在这种情况下,每个指针在语义上都是一个数组,因此它表示类型为 double 的二维数组。

*有多重含义:

  1. 指定类型中的指针。
  2. 取消引用运算符。
  3. 乘法运算符。

您的示例仅在用于定义自动变量的类型中使用 **
double**,意思是指针到指针到-double.

在您的例子中,this ** 表示指向指针的指针。我想这是不言自明的。 ** 指向一个指针,该指针又指向一个内存位置。如果你想节省内存并且你必须声明一个具有 r 行和 c 列的二维数组并且它们是可变的,这很有用。所以下面是你要做的

      void create_matrix(int r,int c)
      {
           double ** matrix;
           matrix = (double **)malloc(sizeof(double *)*r);
           for(int i=0;i<r;i++ )
               matrix[i] = (double *)malloc(sizeof(double)*c);
           /* do operations on matrix */
           return ;
       }

作者在C中使用一种(不是唯一的)方法创建二维double数组,即创建Y个一维double数组,并创建一个X指针数组。这些 Y 数组中的每一个都由 double * 类型的变量访问。然后他创建了一个指向每个数组 的指针的一维数组 ,并将这些指针存储在类型为 double ** 或指针到指针的数组中-双。

使用这种方法制作二维数组有几个优点。第一,你需要做更少的数学运算来到达一个元素,你甚至可以将这样的数组传递给不需要知道它们的确切尺寸就可以工作的函数。此外,您可以创建三角形阵列或其他子阵列不需要全部相同大小的形状。

唯一的缺点是它们占用了更多的内存。