84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
void* 指针有什么用?(不是哪些情况用void,而是关于后面的疑问->)int转v oid* 再转回 int* ,跟 int* 转 float* 再转回 int* 从结果来说不是一样的么?void* 作为"中间人"的功能,float* 也能做到,用void* 仅仅是为了“看起来”合乎逻辑?
学习是最好的投资!
void*指针其实可以用作泛型,你想象一下你在C中要交换两个变量,如果是两个整数的话,就像:
void*
void swap_int(int* lhs, int* rhs) { int tmp = *lhs; *lhs = *rhs; *rhs = tmp; }
如果要交换小数,那还要写一个
void swap_float(float* lhs, float* rhs) { ;// }
那么既然都是把两个变量的bit pattern交换一下,那就可以把这种方法抽象出来:
void swap(void* lsh, void* rhs) { ;// }
因为你不知道究竟要交换多少个bit,所以,还需要一个参数来指定要交换的bit的数量:
void swap(void* lsh, void* rhs, size_t size) { ;// }
有了这样一个函数,那么如果想要交换两个变量,那就可以:
swap(&ai, &bi, sizeof(int)); swap(&af, &bf, sizeof(float));
题主修改了题目,我也加点,以我的知识,我不确定题主后面这句话是否正确
用void* 仅仅是为了“看起来”合乎逻辑
但是,用回上面的例子,如果我用float*代替void*,那的确是可以的,但是我为什么每次调用它都要先做强制类型转换swap((float* )&ai, (float* )&bi, sizeof(int)),你把这样一个接口给另外的一个人使用,他会怎么想?我擦,你交换两个整数,还要先转换为float*,万一给个新手,人家还不敢用,我擦,你这里面有什么奥妙么?
float*
swap((float* )&ai, (float* )&bi, sizeof(int))
的确,void*和其他指针一样,都是占同样大小的内存空间,唯一和其他指针不同的就在于你不能对void*进行解引用,看起来其他类型的指针都可以用void*来代替,只要在解引用之前把它转换为相应类型的指针就OK了!
那么,如果是这样的话,那用void*的确是为了看起来合乎逻辑。我暂时也想不到有哪些情况是必须要用上void*的!
void *主要用于抽象数据结构,其具体用途有以下几项(不局限于):
void *
variant
setsockopt
void*其实可以理解为一个context,利用它可以很好的实现C语言面向对象编程。我觉得使用void*,不是为了看起来合适,而是一个约定,使用C/C++编程的人员看到void*,习惯性的就会认为——这是个私有数据,只有定义的一方才有权解释;这也是我们在回调函数中传递void*作为userdata的基础共识。
1.不同类型的指针的sizeof是一样的,分配内存时,还不知道这块内存放的是int还是float时,可以让void*指向这块内存,用的时候在强转。2.int * 作为参数传递到函数内部,函数内部暂时没有使用,编译的时候会警告,这时,你可以转一下就不警告了。3.不同类型的指针+1所跳过的字节数是不一样的。
已经有正确答案了,建议看一下stanford cs 107b,在这方面讲的很细。
另外所谓"modern language"像c++,java一般都会在语言本身就帮你提供generic的机制,type cast在大多数情况下都认为是不好的。
void*
指针其实可以用作泛型,你想象一下你在C中要交换两个变量,如果是两个整数的话,就像:如果要交换小数,那还要写一个
那么既然都是把两个变量的bit pattern交换一下,那就可以把这种方法抽象出来:
因为你不知道究竟要交换多少个bit,所以,还需要一个参数来指定要交换的bit的数量:
有了这样一个函数,那么如果想要交换两个变量,那就可以:
题主修改了题目,我也加点,以我的知识,我不确定题主后面这句话是否正确
但是,用回上面的例子,如果我用
float*
代替void*
,那的确是可以的,但是我为什么每次调用它都要先做强制类型转换swap((float* )&ai, (float* )&bi, sizeof(int))
,你把这样一个接口给另外的一个人使用,他会怎么想?我擦,你交换两个整数,还要先转换为float*
,万一给个新手,人家还不敢用,我擦,你这里面有什么奥妙么?的确,
void*
和其他指针一样,都是占同样大小的内存空间,唯一和其他指针不同的就在于你不能对void*
进行解引用,看起来其他类型的指针都可以用void*
来代替,只要在解引用之前把它转换为相应类型的指针就OK了!那么,如果是这样的话,那用
void*
的确是为了看起来合乎逻辑。我暂时也想不到有哪些情况是必须要用上void*
的!void *
主要用于抽象数据结构,其具体用途有以下几项(不局限于):variant
, 比如setsockopt
;void*其实可以理解为一个context,利用它可以很好的实现C语言面向对象编程。我觉得使用void*,不是为了看起来合适,而是一个约定,使用C/C++编程的人员看到void*,习惯性的就会认为——这是个私有数据,只有定义的一方才有权解释;这也是我们在回调函数中传递void*作为userdata的基础共识。
1.不同类型的指针的sizeof是一样的,分配内存时,还不知道这块内存放的是int还是float时,可以让void*指向这块内存,用的时候在强转。
2.int * 作为参数传递到函数内部,函数内部暂时没有使用,编译的时候会警告,这时,你可以转一下就不警告了。
3.不同类型的指针+1所跳过的字节数是不一样的。
已经有正确答案了,建议看一下stanford cs 107b,在这方面讲的很细。
另外所谓"modern language"像c++,java一般都会在语言本身就帮你提供generic的机制,type cast在大多数情况下都认为是不好的。