c语言中的自引用指针

c语言中的自引用指针,c,pointers,C,Pointers,有人能解释一下自我参照指针吗。自引用数据类型是包含指针或对其自身类型的引用的类型,但我想了解自引用指针。你能用一些代码解释一下这个术语吗 了解更多信息的任何链接/资源也将非常有用 编辑1: 你能解释一下吗: 唯一的自引用指针是void* 还有一个让我更困惑的代码: int*p=(int*)&p 除了void*,C中没有自引用指针。这是因为,如果要编写 foo* p; foo* pp = &p; 如果pp是自引用指针,则类型不兼容,因此编译将失败。编译将通过的唯一类型是foo为void的

有人能解释一下自我参照指针吗。自引用数据类型是包含指针或对其自身类型的引用的类型,但我想了解自引用指针。你能用一些代码解释一下这个术语吗

了解更多信息的任何链接/资源也将非常有用

编辑1:

你能解释一下吗:

唯一的自引用指针是
void*

还有一个让我更困惑的代码:

int*p=(int*)&p


除了
void*
,C中没有自引用指针。这是因为,如果要编写

foo* p;
foo* pp = &p;
如果
pp
是自引用指针,则类型不兼容,因此编译将失败。编译将通过的唯一类型是
foo
void
的情况,这是因为允许将
void**
指针转换为
void*
指针

实际上,您指的是自引用类型,例如在实现链表时可以找到的类型。

您可以通过以下方式构造自引用指针:

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;
}
此结构不是很有用,它是一个简单的间接寻址,但您可以通过自引用的方式对其进行初始化:

#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;
}
#包括
结构自{struct self*self;};
int main(){
结构自身s={&s};
结构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?'=':'!');
返回0;
}

在这两种情况下,
p
都包含自己的地址,可以将其解释为
p
是自参考的。

您需要更具体地说明您的问题。做
void*p=&p
很简单,但我想你是在问一些更复杂(也没那么没用)的问题。你似乎指的是你在某个地方读过或听说过的一个术语(“自指指针”)。你能参考那个来源来提供一些背景吗?看@rimiro你链接的问题似乎解释得很好。你在理解上有困难吗?在
int*p=(int*)&p,强制转换是必需的,因为
&p
的类型
int**
int*
不兼容,但强制转换告诉编译器“我知道我在做什么”。
void*p;p=&p示例还具有类型转换功能,但任何数据指针类型都可以转换为
void*
,而无需强制转换。
&p
的类型是
void**
,但是C允许隐式转换为
void*
。请解释一下edit@rimiro:是,
void*
是例外。我已经添加了它。注意
void*p;p=&p示例具有类型转换功能,但任何数据指针类型都可以转换为
void*
,而无需强制转换。
&p
的类型为
void**
,但C允许隐式转换为
void*
。“自引用数据类型是包含指针或对其自身类型的引用的类型”同样的,你将如何定义自引用指针。@rimiro你在寻找没有知识的知识。唯一能使指针“自我引用”的是指向自身。
#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;
}