据我所知
**ptr= 指针变量 ptr
&ptr的内存位置地址 = ptr 值存储的内存位置地址。
我是对的还是**ptr == &ptr?
如果它们相等,我是否可以&ptr作为函数的传递地址作为替代ptr?了解我这一点。
如果您理解对于任何指针(或数组)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]。但是不要在真正的代码中这样做,它只会混淆代码并给代码的新读者造成混淆。
| 归档时间: |
|
| 查看次数: |
5658 次 |
| 最近记录: |