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

C 将变量强制转换为(void*)有什么影响?,c,pointers,casting,void,C,Pointers,Casting,Void,在C程序中,我看到以下语句: memcpypgm2ram((void*)&AppConfig.MyMACAddr, (ROM void*)SerializedMACAddress, sizeof(AppConfig.MyMACAddr)); 这个(void*)案例是做什么的?这是为微芯片C30编译器编写的 AppConfig的定义如下: APP_CONFIG AppConfig; // APP_CONFIG is obviously a structure... static RO

在C程序中,我看到以下语句:

memcpypgm2ram((void*)&AppConfig.MyMACAddr, (ROM void*)SerializedMACAddress, sizeof(AppConfig.MyMACAddr));
这个(void*)案例是做什么的?这是为微芯片C30编译器编写的

AppConfig的定义如下:

APP_CONFIG AppConfig;  // APP_CONFIG is obviously a structure...
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};
SerializedMACAddress的定义如下:

APP_CONFIG AppConfig;  // APP_CONFIG is obviously a structure...
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的定义如下: #定义memcpypgm2ram(a,b,c)memcpy(a,b,c)


所以基本上,
void*memcpy(void*dest,const void*src,size\u t n)

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


任何其他数据指针类型都可以隐式转换为
void*
,因此显式转换可能是错误的(不必要的),或者是损坏的编译器的解决方法,或者是转换为
unsigned char*
(在这种情况下,它是损坏接口的解决方法).

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


任何其他数据指针类型都可以隐式转换为
void*
,因此显式转换可能是错误的(不必要的),或者是损坏的编译器的解决方法,或者是转换为
unsigned char*
(在这种情况下,它是损坏接口的解决方法).

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

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

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


该函数只接受任意类型的两个指针,并将n个字节(在您的示例中为n=sizeof(AppConfig.MyMACAddr))从一个地址复制到另一个地址

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


该函数只接受任意类型的两个指针,并将n个字节(在您的示例中为n=sizeof(AppConfig.MyMACAddr))从一个地址复制到另一个地址

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


关键是memcpypgm2ram是一个作用于内存中任何字节的函数,因此它不接受强类型指针作为参数。

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


关键是memcpypgm2ram是一个作用于内存中任何字节的函数,因此它不会接受强类型指针作为参数。

在这种特定情况下,如果不查看更多上下文(如何声明
memcpypgm2ram
),就无法说明使用
(void*)
强制转换的意义

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

不过,另一种可能性是原始指针类型是const限定的,因此使用对
void*
的强制转换来删除const限定。但是,我在您提供的内容中没有看到任何const限定,这意味着,很可能没有必要强制转换为
void*
。我的猜测是,无论是谁把它放在那里,都是“以防万一”,没有真正的理由


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

在没有更多上下文的情况下,无法说明在这种特定情况下使用
(void*)
强制转换的意义(如何声明
memcpypgm2ram

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

另一种可能性是,原始指针类型是const限定的,因此对
void*
的强制转换被用来删除const限定。但是,我在您提供的内容中没有看到任何const限定,这意味着,很可能对
void*
的强制转换是不必要的。我猜把它放在那里“以防万一”没有真正的理由


简而言之,
(void*)
cast将指针转换为
void*
类型。但由于该转换无论如何都会隐式进行,因此该cast完全没有必要(假设
memcpypgm2ram
是使用
void*
参数声明的)。

在本例中,转换为(void*)可以用来消除编译器的警告。

在这种情况下,可以使用强制转换到(void*)来消除编译器的警告。

如果转换到
void*
使编译器发出错误,则编译器被破坏。如果转换到
void*
使编译器发出错误,则编译器将