目录
前言
一、void*指针使用时不同编译器下的处理结果
二、void*指针传递的指针变量进行位运算时,一定要注意强制转换的类型,和值的取值范围
总结
前言
众所周知,void* 指针作为函数形参时,表示可以接受任意类型的参数,但是函数内在使用时要先强制转换,否则无法使用,是不能对void*类型的指针进行解引用的。本文着重探讨它在作为函数形参的要注意的问题。
一、void*指针使用时不同编译器下的处理结果
上图定义了一个char类型变量a,和变量b,然后在函数内强制转换为char类型的指针,将地址传递给x,和y,赋值之后,看起来一切正常,那么,接下来,就是见证诡异的时刻.
图一:
图二:
仔细比较上面两张图,图二只是将强制转换的类型从char 变成了 int,发现其a值已经出现了异常。图一,则做了一点修改,把*y的赋值放到前面,其a,b的值恢复了正常,但是函数内的y值却有了异常。
这是为什么呢?现在还没有答案。不急,再变化一种方式接着看。
此时我们发现,好像在传递指针类型的时候,若是强制转换的类型比传递的大,就会出现这种诡异情况,那么如何解决呢?很简单,检查你的编译器!不过这种编译出来的错误结果,也是有好处的,能及时提醒你这么做可能会导致那些异常,而不至于在程序已经编写了之后,运行过程中出现了预料之外的bug
同样的代码,在这里就运行正常了。
二、void*指针传递的指针变量进行运算时,一定要注意强制转换的类型,和值的取值范围
众所周知,对一个指针类型的变量进行解引用后,其使用就是对存在于这个地址上的变量进行操作,先看成功的示例,这个函数的功能是使用异或的方式,交换两个数的值。
正常一:
正常二:
错误一:
错误二:
总结
关于void*类型指针的说明,资料甚少,包括《C和指针》这本书籍也只是一笔带过,还有《C专家编程》和《C陷阱与缺陷》等专业的C语言书记,都没有提到这一点,网上也没搜到这一块好的资料,就将本人实际使用过程中的遇到的问题和经验分享出来,void*类型指针虽然可以包容任意类型的指针参数,但是在函数内部不能无所顾忌的随意使用,仍然要注意传递的参数的类型.