本文将为您提供关于与C中的void指针等效的详细介绍,我们还将为您解释c语言指针中*与&是什么意思的相关知识,同时,我们还将为您提供关于'void*'和'void*(*function)(void*)
本文将为您提供关于与C中的void指针等效的详细介绍,我们还将为您解释c语言指针中*与&是什么意思的相关知识,同时,我们还将为您提供关于'void *' 和 'void * (*function)(void *)' 初始化、转换和函数指针调用之间的区别?、C void指针和指针比较、c – Void指针初始化?如果没有,那是什么?、c – 为什么在Windows 64位平台上,void指针的大小为4的实用信息。
本文目录一览:- 与C中的void指针等效(c语言指针中*与&是什么意思)
- 'void *' 和 'void * (*function)(void *)' 初始化、转换和函数指针调用之间的区别?
- C void指针和指针比较
- c – Void指针初始化?如果没有,那是什么?
- c – 为什么在Windows 64位平台上,void指针的大小为4
与C中的void指针等效(c语言指针中*与&是什么意思)
我一直在玩Go制作一些数据结构库,这是一个大问题。我希望数据结构能够包含任何类型,但是在Go中我看不到任何方法可以执行此操作,因为您无法声明空指针,并且它们没有像NSObject这样的类,所有对象都可以从中继承。如何在Go中实现相同的功能?
答案1
小编典典根据Go编程语言规范:
类型实现包含其方法的任何子集的任何接口,因此可以实现几个不同的接口。例如,所有类型都实现 空接口 :
接口{}
如果您在该文档中搜索interface{}
,则会看到很多示例,这些示例说明了如何使用它来执行所需的操作。
'void *' 和 'void * (*function)(void *)' 初始化、转换和函数指针调用之间的区别?
如何解决''void *'' 和 ''void * (*function)(void *)'' 初始化、转换和函数指针调用之间的区别??
更具体地说,这 3 个指针在符号表和编译器中是如何工作的?
我的理解是:
void * object
是指向具有未指定类型的对象或函数的指针,它基本上需要对对象进行强制转换才能正确解释,例如 (int)object
。
只要编译器具有该对象的有效类型信息声明(包括符号表中的存储限定符和说明符),就可以按成员/对象类型进行转换吗?
例如:
void * object;
struct Structure {int member;} Structure;
printf("Object is: %d\n",(Structure->member)(*object));
或者在函数的情况下:
void * (* function)(void *);
我的理解是,对象命名一个指向函数的指针,该函数接受一个指向未知对象或函数指针的指针,该指针返回一个指向未知对象或函数指针的指针。函数调用/取消引用不清楚。假设赋值给初始化对象声明的 void * 对象应该假定它是从初始化的类型。
这些函数指针调用有什么区别?
struct Structure {void *member;} Structure;
Structure.member = &main();
/*This assignment,based on my understanding,to Structure.member from main() is supposed to
*initialize ember to the type of main() which is assigned automatically or via memcpy()*/
Structure.member(arg);
/*or:*/
Structure.(*(member(arg)));
/*or:*/
Structure.(*member(arg)));
这种格式看起来是:
(cast_type) (return_object_type_qualifiers_specifiers)(object_name)(object_parameters);
这个分组是如何工作的?
解决方法
A void *
不包含有关它指向的对象类型的信息。由程序员来跟踪它并将其转换回正确的指针类型。
在这个例子中:
struct Structure {void *member;} Structure;
Structure.member = &func;
将 Structure.member
视为函数是无效的,因为这不是它的类型。在调用之前,需要将其转换回正确的函数指针类型。因此,如果 func
被定义为 void func(void)
,您需要这样做:
((void (*)(void))Structure.member)();
此外,严格不允许将函数指针转换为对象指针,void *
是对象指针,但是您可能使用的大多数实现仍然支持它。
C void指针和指针比较
void removeData(void *data,struct acclist *theList) { struct acclistNode* cur = theList->head; struct acclistNode* prev = NULL; for(; cur != NULL; prev = cur,cur = cur->next) { if(cur->data == data) { if(cur == theList->head) { theList->head = cur->next; } if(cur == theList->tail) { theList->tail = prev; } if(prev != NULL) { prev->next = cur->next; } free(cur); return; } } }
cur-> data == data背后的含义是什么?
由于我的数据是通用的(void *),这对于任何基本类型和任何结构类型意味着什么?
例如,考虑员工结构:
struct employee { char name[20]; float wageRate; };
如果数据类型为struct employee *,那么语句cur-> data == data如何工作?
由于数据是指向结构的第一个内存地址的指针,我只是比较指针地址?
解决方法
cur->data == data
将指针cur->数据与指针数据进行比较.你要比较他们的价值,而不是他们的地址.指针是一个像任何其他变量一样的变量.它有一个地址(即& some_ptr)和一个值(即它所指的东西的地址).
请注意,其他类型的比较(即<>> =< =)会导致未定义的行为,除非指针指向同一个数组的元素或一个超过结尾的元素(不是这样做有意义除非你知道他们指的是“对象”,无论如何都存在于同一块连续的记忆中,但仍然存在.
c – Void指针初始化?如果没有,那是什么?
void (*cb)(void)
这是初始化void指针的另一种方法吗?这样做对虚空* cb有什么好处?
解决方法
例如,如果我有
void printHello( ) { cout << "hello" << endl; }
那我以后可以
void (*cb)(void); cb = printHello;
我可以使用以下方法调用函数:
cb();
这将调用printHello();
这样做的用处是我现在可以为cb分配不同的函数并调用它们并将它们传递给其他函数,就像任何其他指针变量一样.
通常为了清楚起见,程序员将为此创建一个特定的类型,以避免写这个:
typedef void (*tPrtToVoidFn)(void); tPtrToVoidFn cb; cb = printHello;
为了比较,指向返回int的函数的指针如下所示:
int (*ptrToFunctionReturningInt)(void);
并且指向函数的指针采用int并且不返回任何内容,如下所示:
void (*ptrToFunctionReturningnothing)(int);
c – 为什么在Windows 64位平台上,void指针的大小为4
#include <stdio.h>void main(){ printf("%d",sizeof(void*));}
解决方法
Windows 7 64位可以运行为32位平台编译的代码.根据程序的输出判断,您的代码似乎是针对Win-32编译的.
在Visual Studio 2010中,转到C/C++项目的属性页,并确保在“平台”下拉列表中选择了Active(x64)(默认情况下为Win32).如果下拉列表中没有x64,请单击[Configuration Manager …],然后为项目平台选择x64.如果打开“从…复制”对话框,请单击[确定]将其关闭.重新编译后,程序应以64位模式运行.
今天的关于与C中的void指针等效和c语言指针中*与&是什么意思的分享已经结束,谢谢您的关注,如果想了解更多关于'void *' 和 'void * (*function)(void *)' 初始化、转换和函数指针调用之间的区别?、C void指针和指针比较、c – Void指针初始化?如果没有,那是什么?、c – 为什么在Windows 64位平台上,void指针的大小为4的相关知识,请在本站进行查询。
本文标签: