**ptr 和 &ptr 的区别

ska*_*a93 1 c pointers

据我所知

**ptr= 指针变量 ptr
&ptr的内存位置地址 = ptr 值存储的内存位置地址。

我是对的还是**ptr == &ptr

如果它们相等,我是否可以&ptr作为函数的传递地址作为替代ptr?了解我这一点。

Som*_*ude 5

如果您理解对于任何指针(或数组)p和索引i,表达式*(p + i)等效于p[i].

现在 ifi为零,这意味着我们有*(p + 0)which 等于*p,以及它的等价表达式p[0]。这意味着当您取消引用一个指针时,您将获得它指向的位置的值。

只有当指针指向另一个指针时,才能对指针进行双重取消引用。

不过,您对 address-of 运算符的理解&是正确的。


让我们看一个例子:

int a = 10;
int *p = &a;    // Makes p point to the variable a
int **pp = &p;  // Makes pp point to the variable p
Run Code Online (Sandbox Code Playgroud)

现在,如果我们这样做,*pp我们将获得指针p,如果我们这样做,我们将**pp获得变量a及其值。

printf("Value of a is %d\n", a);   // Will print "Value of a is 10\n"
printf("Value of *p is %d\n", *p);   // Will print "Value of *p is 10\n"
printf("Value of **pp is %d\n", **pp);   // Will print "Value of **pp is 10\n"
Run Code Online (Sandbox Code Playgroud)

此外,使用指向指针的指针似乎不太有用,但是如果您考虑动态分配的数组,事情就会发生变化。对于动态分配的数组,您需要使用指针,如果您想要一个矩阵(即数组数组),您需要使用指向指针的指针,如果您想动态分配两个“维度”。

此外,虽然 C 不支持通过引用传递参数,但它可以使用指针进行模拟,如果您需要通过引用传递指针,您可以通过将指针传递给指针(使用地址运算符)来实现。

最后一个有趣的小事实。我通过告诉你*(p + i)p[i]是等价的来开始这个答案。由于加法的交换性质,表达式*(p + i)等价于*(i + p)which 意味着p[i]等价于i[p]。但是不要在真正的代码中这样做,它只会混淆代码并给代码的新读者造成混淆。