|
发表于 2010-4-7 23:43:05
|
显示全部楼层
回答正确,但还不深入。
以下是网上的解释,估计你也是看了这个解释的:
------------------------------------------------------------
规则三 小心使用void指针类型
按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:
void * pvoid;
pvoid++; //ANSI:错误
pvoid += 1; //ANSI:错误
ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。例如:
int *pint;
pint++; //ANSI:正确
pint++的结果是使其增大sizeof(int)。
但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定,它指定void *的算法操作与char *一致。
-------------------------------------------------------------
比较关键的是理解最后一句的解释:“GNU指定void *的算法操作与char *一致”。
然后考虑如何正确的使用函数:NutUdpSendTo (UDPSOCKET *sock, u_long addr, u_short port, void *data, u_short len)
这个函数同内存拷贝函数void * memcpy(void *dest, const void *src, size_t len)类似,是把内存中一片连续区域中的数据“按字节”送到另外一个地方。
参数使用 void *data 说明,首先是它可以接受任何类型的指针,然后在函数中是按字节(char)型指针操作的。这样处理,使的这个函数成为所谓“一个纯粹的,脱离低级趣味的函数!”,能够“不必考虑其类型”,连续搬动一段内存数据了。
可是使用起来还是要注意,否则会出现问题,而且对于基础不牢固的人会更搞不清楚,用不好的。
比如,你准备传送int类型(假定占2个字节)的10个数据,那么尽管在调用NutUdpSendTo (UDPSOCKET *sock, u_long addr, u_short port, void *data, u_short len)过程时,你可以直接把int型指针传给void *data,但u_short len必须是20,而不是10!
当你传送一个结构变量指针的话,更要注意这个结构是几个字节的,仔细计算正确的长度。如果不注意,出了问题都不知道为什么,让你找不到北!
指针类型可以不考虑,算是一个“纯粹的,脱离低级趣味”的函数,但要麻烦使用者正确考虑长度,出了问题一概不负责任。我的理解实际是很低级的。 |
|