【问题标题】:Can there be a pointer to a pointer to a pointer? [duplicate]可以有一个指向指针的指针吗? [复制]
【发布时间】:2015-02-16 07:42:59
【问题描述】:

如果C中有指针(char *names[])和指向指针的指针(char **cur_name = names);可以有指向指针的指针吗?

或者一个指向指针的指针只是一个链表?也许这是一个愚蠢的问题,但我想知道答案。

【问题讨论】:

  • 缩短标题。是的,支持 3 级指针。其实many levels are possible
  • 这个问题已经有人问过了!检查this线程!
  • 指针和链表是两个完全不同的东西。
  • 一般来说,如果代码必须取消引用超过两个级别,是时候认真考虑重新设计代码了。

标签: c pointers syntax


【解决方案1】:

是的,您可以有任意数量的指针级别。

int x = 5;
int *a = &x;
int **b = &a;
int ***c = &b;

printf("%d %d %d %d\n", x, *a, **b, ***c);

指向指针的指针不是链表。链表是一种结构类型,其中包含指向其自身类型的指针:

struct list
{
   int data;
   struct list *next;
};

这样您就可以将它们链接在一起形成一个列表:

struct list three = { 3, NULL };
struct list two = { 2, &three };
struct list one = { 1, &two };
struct list head = { 0, &one };

并遍历它们:

for (struct list *node = &head; node->next; node = node->next)
{
    printf("%d\n", node->data);
}

【讨论】:

  • 但是操作是正确的,访问链表的第 n 个元素并取消引用 n 级指针(在幕后)是完全相同的事情(模一些指针算术)。
【解决方案2】:

让我们用更简单的术语来表达。

声明一个变量 - 什么类型并不重要 - 它代表内存中的一个位置。

int foo=1;

然后您可以声明另一个指向那个变量的变量。

int *bar;
bar = &foo;

再次扩展它——声明一个指向那个变量的指针...等等。

int *baz;
baz = &bar;

关键是对任何给定指针可以使用或声明的间接级别没有限制。而且,从语法上讲,你可以这样做

int ****nthLevelPointer;

现在,以其他人可能必须维护的方式在代码中跟踪完全是另一个问题:)

【讨论】:

  • 谢谢,这在概念上很有意义。不过我想知道,当您像示例 int *baz... 那样创建指向指针的指针时,语法不会是 **baz;而不是 *baz?我对何时使用两颗星而不是一颗星感到困惑。
【解决方案3】:

一个简单的例子:

struct List
{
    struct List* next ;
}

struct List a ;
struct List* p = &a ;
p->next = p ;
p = p->next ;
p = p->next->next ;
p = p->next->next->next ;
p = p->next->next->next->next ;
p = p->next->next->next->next->next ;
p = p->next->next->, ... ,next->next->next ;

表明指针间接深度没有理论上的限制。

【讨论】:

    【解决方案4】:

    你的答案是肯定的。 指针只是对内存的引用。所以如果我们可以引用内存,我们也可以引用指针。你可以在你的进程堆中获取它们的大小。你也可以通过局部变量来定义它们。假设这个模式:

    指针 a -----> 指针 b -----> 指针 c ------>(局部变量或在堆中定义变量)

    【讨论】:

      【解决方案5】:

      简短回答: 指针指向内存中的地址,这些地址本身可能包含更多的指针。限制是可用地址的数量。

      简短的回答: 是的,可以有一个pointer-pointer-pointer。

      【讨论】:

        【解决方案6】:

        指向指针的指针是可能的。

        如果你像这样声明一个变量:

        int ***ptr;
        

        然后:

        ->    ptr will be a pointer to a pointer to a pointer to an int variable
        ->   *ptr will be a pointer to a pointer to an int variable
        ->  **ptr will be a pointer to an int variable
        -> ***ptr will be a int variable
        

        因此:

        highest pointer level:    ptr
             ...                 *ptr
             ...                **ptr
        int variable           ***ptr
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-11
          • 1970-01-01
          • 1970-01-01
          • 2010-09-22
          • 1970-01-01
          • 2011-02-01
          • 1970-01-01
          相关资源
          最近更新 更多