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