有人可以直接在这些无处不在的差异之间设置路径,因为它可以让人有点心灵。
例如,如果我有一个 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引用和对象指向的更早?
答案 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数组的第二个单元格中。)