GVKun编程网logo

与C中的void指针等效(c语言指针中*与&是什么意思)

22

本文将为您提供关于与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语言指针中*与&是什么意思)

与C中的void指针等效(c语言指针中*与&是什么意思)

我一直在玩Go制作一些数据结构库,这是一个大问题。我希望数据结构能够包含任何类型,但是在Go中我看不到任何方法可以执行此操作,因为您无法声明空指针,并且它们没有像NSObject这样的类,所有对象都可以从中继承。如何在Go中实现相同的功能?

答案1

小编典典

根据Go编程语言规范:

类型实现包含其方法的任何子集的任何接口,因此可以实现几个不同的接口。例如,所有类型都实现 空接口

接口{}

如果您在该文档中搜索interface{},则会看到很多示例,这些示例说明了如何使用它来执行所需的操作。

'void *' 和 'void * (*function)(void *)' 初始化、转换和函数指针调用之间的区别?

'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指针和指针比较

C void指针和指针比较

我有以下函数从C中的链表中删除通用数据:

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指针初始化?如果没有,那是什么?

c – Void指针初始化?如果没有,那是什么?

我试图理解在C中用作参数的一段代码,但我似乎无法在互联网上的其他地方找到它的另一个例子.这是片段:

void (*cb)(void)

这是初始化void指针的另一种方法吗?这样做对虚空* cb有什么好处?

解决方法

在这个例子中,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

c – 为什么在Windows 64位平台上,void指针的大小为4

我有以下程序打印4.我在 Windows 7 64位上运行此程序.不应该为64位平台打印8?提前致谢.
#include <stdio.h>void main(){    printf("%d",sizeof(void*));}

解决方法

当您使用诸如C的编译语言时,指针的大小不是由运行代码的平台决定的:它仅取决于您编译代码的平台.

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的相关知识,请在本站进行查询。

本文标签: