指针变量可以存储另一个指针变量的地址吗?

4

指针变量可以持有另一个指针变量的地址吗?例如:
int a; int *ptr,*ptr1; ptr=&a; ptr1=&ptr;

是可以的。


6
int **ptr 的意思是“指向指针的指针,它可以存储 int 类型的地址”。 - user166390
指针保存一个地址。只要它被正确地输入(或者你以某种方式伪造它),指针就不会在意所寻址的内容。但请注意,你应该将指针的类型定义为指向指针,而不是 int 或其他类型。 - Hot Licks
1
@HotLicks:在常见的实现中,这是正确的,但在原则上和正式语言中并非如此。不能保证您可以通过不正确的指针类型进行转换,然后再返回相同的值,事实上,在某些对齐考虑等方面存在的机器上,您可能无法这样做。您确实需要正确的指针类型,或者您可以使用字符类型指针或void指针,它们可以安全地保存任何指针。 - R.. GitHub STOP HELPING ICE
我有点把指针看作是《极速前进》中的信封。当你找到一个信封时,你需要打开它以找到下一个位置,希望那就是你的目标。你的情况就像打开一个通往最终目的地的信封,这是完全合法的。 - Stephen Quan
@R.. -- 是的,我知道这一切,但我不想写一本书。 - Hot Licks
6个回答

10

当然可以,指向指针的指针。

int i;
int *pi = &i;
int **ppi = π

指向指针的变量并不特别奇怪。它像其他变量一样,包含一个像其他变量一样的变量地址。只需要设置正确的类型,让编译器知道如何处理它们。


ptrptr在您的示例中具有相同的名称,因此存在类型不匹配(int ** vs int ***)使代码无效。 - R.. GitHub STOP HELPING ICE
那就是他们的问题。这就是我在没有编译器的情况下编程的结果。已修复。 - Jonathan Wood

3
是的,但需要具有正确的类型。在你的例子中,int *ptr,*ptr1;中,ptrptr1都有"指向int的指针"类型,只能指向int,而不是指针。如果声明int *ptr,**ptr1;,那么ptr1就有了"指向int *的指针"类型,因此可以指向ptr

1

这是一个示例,展示了发生了什么

int a = 13; 
int *ptr,
int **ptr1;       // ** means pointer to pointer
ptr = &a;   
ptr1 = &ptr;

cout << a;        //value of a  

cout << *ptr;     //ptr points to a, *ptr is value of a  
cout << **ptr1;   //same as above

cout << &ptr;     //prints out the address of ptr
cout << *ptr1;    //same as above

对于 int ***ptrint ****ptr,它们的工作方式相同。


0
指向指针是可能的(也非常常见),但是 int * 可能不足以包含另一个 int * 的地址。因此请使用 int **(或 void*,用于通常的指针)。

0

这里有两个答案,它们都是肯定的。

两个指针可以指向同一个位置。

int b, *p1=&b, *p2=&b;
*p1 = 123;
*p2; // equals 123

你还可以有一个指向指针的指针:
int x=2, y=3, *p=&x, **q=&p 注意多了一个星号。
**q; // equals 2
*q = &y;
**q; // equals 3
**q = 4;
  y; // equals 4

0

是的,请看下面的代码。我希望它能满足您的需求。

int a = 4;
int *ptr = &a;
int *ptr1 = (int*)&ptr; 
cout << **(int**)ptr1;

这里的ptr1是单指针,但表现为双指针


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接