void* 指针有什么用?(不是哪些情况用void,而是关于后面的疑问->)int 转v oid* 再转回 int* ,跟 int* 转 float* 再转回 int* 从结果来说不是一样的么?void* 作为"中间人"的功能,float* 也能做到,用void* 仅仅是为了“看起来”合乎逻辑?
黄舟2017-04-17 11:20:49
void*
Pointers can actually be used as generics. Imagine you want to exchange two variables in C. If they are two integers, it would be like:
void swap_int(int* lhs, int* rhs)
{
int tmp = *lhs;
*lhs = *rhs;
*rhs = tmp;
}
If you want to exchange decimals, you need to write another
void swap_float(float* lhs, float* rhs)
{
;//
}
So since the bit patterns of the two variables are exchanged, this method can be abstracted:
void swap(void* lsh, void* rhs)
{
;//
}
Because you don’t know how many bits to exchange, you also need a parameter to specify the number of bits to exchange:
void swap(void* lsh, void* rhs, size_t size)
{
;//
}
With such a function, if you want to exchange two variables, you can:
swap(&ai, &bi, sizeof(int));
swap(&af, &bf, sizeof(float));
The questioner has modified the question, and I have added some points. Based on my knowledge, I am not sure whether the sentence after the questioner is correct
Use void* just to "look" logical
However, going back to the above example, if I use float*
instead of void*
, that is indeed possible, but why do I have to do a cast type conversion swap((float* )&ai, (float* )&bi, sizeof(int))
every time I call it? You put such a If the interface is used by another person, what will he think? Damn it, if you exchange two integers, you have to convert it to float*
first. If you give it to a newbie and they don’t dare to use it, Damn, do you have any secrets here?
Indeed, void*
and other pointers occupy the same size of memory space. The only difference from other pointers is that you cannot dereference void*
. It seems that other types of pointers can be used void*
Instead, just convert it to a pointer of the corresponding type before dereferencing and you're good to go!
Well, if that’s the case, then using void*
is indeed to look logical. I can’t think of any situations where void*
must be used!
迷茫2017-04-17 11:20:49
void *
is mainly used for abstract data structures. Its specific uses include the following (not limited to):
variant
, such as setsockopt
; 阿神2017-04-17 11:20:49
void* can actually be understood as a context, which can be used to implement C language object-oriented programming. I think using void* is not to look appropriate, but a convention. When people who program in C/C++ see void*, they will habitually think that this is private data, and only the party that defined it has the right to interpret it. ;This is also the basic consensus that we pass void* as userdata in the callback function.
伊谢尔伦2017-04-17 11:20:49
1. The sizeof of different types of pointers is the same. When allocating memory, if you don’t know whether the memory is int or float, you can let void* point to this memory and force transfer when using it.
2.int * is passed to the inside of the function as a parameter. It is not used inside the function for the time being. A warning will be issued during compilation. At this time, you can change it and it will not warn.
3. The number of bytes skipped by different types of pointers +1 is different.
迷茫2017-04-17 11:20:49
There is already a correct answer. It is recommended to read stanford cs 107b, which explains this aspect in detail.
In addition, so-called "modern languages" such as C++ and Java will generally help you provide generic mechanisms in the language itself. Type cast is considered bad in most cases.