指针指针,指向值地址和2D阵列访问之间的清晰度

时间:2012-04-15 16:07:33

标签: c++ c

有人可以直接在这些无处不在的差异之间设置路径,因为它可以让人有点心灵。

例如,如果我有一个 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指针或ponter-to-pointer引用的访问吗?

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

*(recptr +i)**(ptr2ptr +i)之间又有什么区别?!是后来也是2D访问或访问指针2-ponter引用和对象指向的更早?

1 个答案:

答案 0 :(得分:1)

double *recptr[3];

这会创建一个包含双倍(double*)的3个指针的数组 现在,在main()中,我们有两倍n1 = 12.0f和一倍n2 = 3.4f

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

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

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

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

现在,我们取消引用这个位置*(recptr + i)(第一个元素的地址+ sizeof(double*)个字节),我们看到了什么?好吧,它是指向双精度的指针(换句话说,它只是一个n2的地址)。因此我们需要再次取消引用以实际看到此特定指针指向的值,因此**(recptr + i)

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

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