增加链表节点,用malloc函数开辟空间,为什么在malloc前面加(node*)而不是(node

增加链表节点,用malloc函数开辟空间,为什么在malloc前面加(node*)而不是(node)。malloc返回的不就是个地址吗?

前面加的这个是强制类型转换,正因为malloc返回的是地址,所以才不能写(node)啊。地址其实就是个整数,如何能将一个整数强制转换为一个链表结点呢。而加(node*)是因为malloc返回的地址值是void*类型的,所以需要强制转换一下类型。追问

我觉得有点问题,就是地址是一个常量。把一个常量地址变成一个指针就好像把常量变成变量那种感觉。
我觉得这样解释不较好,malloc返回的是一个指向开辟内存空间首地址的void 类型的指针,然后把这个指针强制类型转换一下。
你觉得呢?

追答

C语言的函数都是传值的。地址不是一个常量,它是一个值,可以是常量的值,也可以是变量的值。malloc返回的不是指向开辟内存空间首地址的void 类型的指针,而是开辟内存空间的首地址,只不过这个地址是void*类型的。一个常量或变量本身的类型不会被转换,而是它的值在传递的过程中被强制类型转换。

追问

地址是一个值,怎么会是void *的类型的呢?一个是容器,存地址的。一个是地址。感觉void *是给容器的,而不是给地址的。

追答

void*是一个类型,可以是变量或常量的类型,也可以是一个值的类型,比如int a是int类型的变量,而3是int类型的值(但当你在代码中直接写出3时会默认在内存中开辟一个常量空间来存放这个值)。一个变量或常量可以认为是一个容器,是一块内存空间,而任何值的本质都只是一串二进制数。那么一个P类型的容器A表示容器A只能存放P类型的值,而P类型的值B表示需要按照P类型的格式或方法去解释B这串二进制数。

追问

明白了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-09-15
只单纯考虑类型的话,node *p = (node*)malloc(sizeof(node)); 因为定义的是node*,所以才强转成node*。这样能理解么
第2个回答  2014-09-15
c++都不用malloc了
相似回答