0

有人可以为这些无处不在的差异指明道路吗,因为它可能有点令人兴奋。

例如,如果我有一个2D数组rec[3][2],则以下访问意味着相同;

rec[0][0] = **rec
rec[i][0] = **(rec + i)
*(*(rec + i) + j) = rec[i][j]

如果是这种情况,那么这些是什么意思:

#include <stdio.h>
double *recptr[3];
int i=1;

main()
{
 double n1=12.0;
 doublw n2=3.4;

 recptr[0]= &n1;
 recptr[1]= &n2;

 printf("Amt: %.2f\n", **(recptr + i));
}

什么是**(recptr + i),这是访问 2D 指针还是指针对指针的引用?

foo(ptr2ptr)double **ptr2ptr;
{
 int i=1, j=0;
 if(**(ptr2ptr +i) > **(ptr2ptr + j))
 {
  double *tmp= *(recptr +i);
 }
}

*(recptr +i)和 又有什么区别**(ptr2ptr +i)?!是后来的二维访问还是对指针 2-ponter 引用的访问以及对象指向的时间越早?

4

1 回答 1

1
double *recptr[3];

这将创建一个包含 3 个指向 double 的指针的数组(double*)
现在,在 中main(),我们有 doublen1 = 12.0f和 double n2 = 3.4f

现在我们将地址分配n1 (&n1)recptr[0](数组的第一个元素恰好指向双精度数,所以现在它指向双精度数(我们的 n1)的地址,这没关系。)-> 请注意,这不是参考(理论上)。我们正在获取 n1 的地址。

我们对 n2 做同样的事情,所以现在recptr[1]是一个指向 n2 地址的指针。

现在我们打印**(recptr + i)-> 这意味着以下内容:

我们获取数组第一个元素的地址(recptr 计算为数组的地址),我们将该地址偏移 i(恰好是 1)。现在请注意,我们不会进一步移动 1 个字节,而是sizeof(double*)进一步移动字节。

现在,我们取消引用这个位置*(recptr + i)(第一个元素的地址 +sizeof(double*)字节),我们看到了什么?嗯,它是一个指向 double 的指针(或者换句话说,它只是一个 n2 的地址)。所以我们需要再次取消引用才能真正看到这个特定指针指向的值,因此**(recptr + i).

因此,第一次取消引用只是为我们提供了 recptr 数组的正确“单元格”,但在那个单元格中,有一个指向 double 的指针,所以为了获得它的值,我们需要再次取消引用。

(然后我们确实打印了 3.40,因为它的地址恰好位于 recptr 数组的第二个单元格中。)

于 2012-04-15T16:31:32.960 回答