【问题标题】:Self Referential Pointer in c [closed]c中的自引用指针[关闭]
【发布时间】:2018-05-10 13:32:02
【问题描述】:

有人可以解释一下自引用指针。自引用数据类型是包含指针或引用它们自己的类型的类型,但我想知道自引用指针。你能用一些代码解释这个术语吗?

任何了解更多相关信息的链接/资源也将非常有帮助。

编辑1:

你能解释一下吗:

唯一的自引用指针是void *

还有这段代码更让我困惑:

int *p = (int*) &p;

【问题讨论】:

  • 您需要更具体地说明您的要求。做void* p = &p 是微不足道的,但我假设你在问一些更复杂(而且没用)的东西。
  • 您似乎指的是您在某处读过或听过的术语(“自引用指针”)。您能否参考该来源以提供一些背景信息?
  • @rimiro 您链接的问题似乎很好地解释了它。您对它的具体有什么理解困难?
  • int *p = (int *) &p; 中,强制转换是必要的,因为&p 的类型int **int * 不兼容,但是强制转换告诉编译器“我知道我是什么正在做”。 void *p; p = &p; 示例还具有类型转换功能,但任何数据指针类型都可以在不进行强制转换的情况下转换为 void *&p的类型是void **,但是C允许隐式转换为void *

标签: c pointers


【解决方案1】:

除了void*,C 中没有自引用指针之类的东西。那是因为,如果你要写

foo* p;
foo* pp = &p;

其中pp是自引用指针,类型不兼容,所以编译会失败。编译通过的唯一类型是 foovoid 的情况,这是因为您可以将 void** 指针转换为 void* 指针。

真的,您的意思是自引用类型,例如在实现链表时可以找到。

【讨论】:

  • 你能解释一下编辑吗
  • @rimiro:是的,void* 是个例外。我已经添加了。
【解决方案2】:

你可以这样构造一个自引用指针:

void *p = &p;

p 是一个指向自身的通用指针。

问题是你不能取消引用这个指针而不强制转换为实际的指针类型。下面是演示这一点的代码:

#include <stdio.h>

int main() {
    void *p = &p;
    printf("p = %p\n", p);
    printf("*(void **)p = %p\n", *(void **)p);
    printf("*(void **)p %c= p\n", *(void **)p == p ? '=' : '!');
    return 0;
}

正如 Jonathan Leffler 所评论的,void *p; p = &amp;p; 具有类型转换功能,但任何数据指针类型都可以在不进行强制转换的情况下转换为 void *&amp;p 的类型是 void **,但是 C 允许隐式转换为 void *

还有自引用类型:

struct self { struct self *self; };

这个结构不是很有用,它是一个简单的间接,但是你可以用自引用的方式来初始化它:

#include <stdio.h>

struct self { struct self *self; };

int main() {
    struct self s = { &s };
    struct self *p = &s;

    printf("p = %p\n", (void *)p);
    printf("p->self = %p\n", (void *)p->self);
    printf("p %c= p->self\n", p == p->self ? '=' : '!');
    return 0;
}

在这两种情况下,p 都包含自己的地址,这可以解释为 p 是自引用的

【讨论】:

  • 请注意,void *p; p = &amp;p; 示例具有类型转换功能,但任何数据指针类型都可以在不进行强制转换的情况下转换为 void *&amp;p的类型是void **,但是C允许隐式转换为void *
  • “自引用数据类型是包含指针或引用它们自己的类型的类型”,与定义自引用指针的方式相同。
  • @rimiro 您正在寻找没有什么可知道的知识。唯一能让指针“自引用”的就是指向它自己。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多