将变量转换为(void *)有什么影响?

时间:2011-03-29 16:04:07

标签: c pointers casting void

在C程序中,我看到以下声明:

memcpypgm2ram((void*)&AppConfig.MyMACAddr, (ROM void*)SerializedMACAddress, sizeof(AppConfig.MyMACAddr));

(void *)的情况是什么?这是为Microchip C30编译器编写的。

AppConfig的定义如下:

APP_CONFIG AppConfig;  // APP_CONFIG is obviously a structure...

SerializedMACAddress的定义如下:

static ROM BYTE SerializedMACAddress[6] = {MY_DEFAULT_MAC_BYTE1, MY_DEFAULT_MAC_BYTE2, MY_DEFAULT_MAC_BYTE3, MY_DEFAULT_MAC_BYTE4, MY_DEFAULT_MAC_BYTE5, MY_DEFAULT_MAC_BYTE6};

编辑:我之前应该说过这个,但是memcpypgm2ram被定义为:    #define memcpypgm2ram(a,b,c)memcpy(a,b,c)

基本上,void *memcpy(void *dest, const void *src, size_t n);

6 个答案:

答案 0 :(得分:5)

void*是通用数据指针类型,当用作参数类型时,表示函数在“裸”内存块上工作。它不能被解除引用。

任何其他数据指针类型都可以隐式转换为void*,因此显式强制转换可能是错误的(不必要的),或者是破坏的编译器的变通方法,或者是强制转换为unsigned char *的简写(在这种情况下,这是一个破解界面的解决方法)。

答案 1 :(得分:1)

强制转换void *将某种类型的指针转​​换为通用指针。

答案 2 :(得分:0)

memcpypgm2ram函数不需要特定类型。它应该用以下原型定义:memcpypgm2ram(void * p1,void * p2,int n); “void *”是对通用指针类型的强制转换。

该函数只需要任意类型的两个指针,并将n个字节(在您的情况下为n = sizeof(AppConfig.MyMACAddr))从一个地址复制到另一个地址。

答案 3 :(得分:0)

memcpypgm2ram可能会将void指针作为其参数。 C足够强大,可以识别& AppConfig.MyMACAddr的类型是(MACAddr *),并且如果不将其转换为void *,则会发出编译时错误。

关键是memcpypgm2ram是一个可以处理内存中保存的任何字节的函数,所以它不接受强类型指针作为参数。

答案 4 :(得分:0)

在没有看到更多上下文((void *)如何声明?)的情况下,没有办法说明在这个特定情况下使用memcpypgm2ram强制转换的重点是什么?

在C语言(以及C ++)中,指针类型可以隐式转换为void *类型,这意味着在指针转换中通常没有理由使用显式转换为void *类型。在您的示例中,所有转换都是指针转换,因此,考虑到我所说的内容,不需要显式转换为void *

另一种可能性是原始指针类型是const限定的,因此转换为void *用于删除const限定。但是,我没有看到你提供的内容中的任何常规资格,这意味着再次强调,转发void *很可能是不必要的。我的猜测是,无论谁把它放在那里“只是为了以防万一”没有真正的理由。

简而言之,(void *)强制转换将指针转换为void *类型。但是,由于无论如何都会隐式地进行转换,所以强制转换是完全没必要的(假设memcpypgm2ram声明为void *参数)。

答案 5 :(得分:0)

在这种情况下,可以使用cast to(void *)来消除编译器的警告。