打算深入的学习一下操作系统以及C语言,通过《Beginning Linux Programming,4Ed》这本书。研究书中的源代码时,就遇到了**void ***.由于以前学习C语言时,只是简单的学习了一下语法,并没有深入的学习,所以,看到这个让我很懵逼。
在Java中,我们使用void的场景,只有当作为函数的返回值时。那C语言中,**void ***到底是什么意思呢?
Google找到了一篇文章,下面我把它翻译下来。尽管这篇文章的评论中批评作者写的不是很通俗易懂,不够条理。但是我看着写的还不错。基本上把**void ***的作用说出来了。
下面开始正文。
在C语言中,**void *是一个没有数据类型的指针。所以,void ***可以存放任何类型的数据的地址,并且可以被转换成任意类型。
void 的优点:malloc()函数和colloc()函数的返回值,都是*void ***,这样,我们就能用这些函数来为任意类型分配内存了。
注意:上面的程序是在C语言环境中编译的,而不是在C++环境中编译的。在C++中,我们必须明确的将malloc函数的返回值转换成**int ***.
当然,**void ***也有一些限制:
- **void *不能被dereferenced(这个单词翻译成中文感觉很难懂,这里就直接使用这个单词。这句话的意思是,void ***形式的指针变量,不能通过在其前面添加星号的形式来获取其值)。例如,下面的程序就不正确:
输出Compiler Error: 'void' is not a pointer-to-object type*.
下面的程序却能正常编译并输出正确结果,因为我们预先将**void *类型的指针转换成了int ***类型的指针:
会输出正确的结果,10.这里有一点需要注意,别乱用**void ***在不同数据类型的指针之间转换,因为不同数据类型占用的字节数不一样,乱用很可能会导 致出现不正确的结果。
- C语言标准中,不允许对**void *进行指针的运算。然而,在GNU C中,却是可以的。void ***的长度会被判定为1.例如下面的程序,可以在gcc中,被正常编译并运行。
输出结果为2.