void* 到底是什么菜鸟不是很清楚!

yuanlaosi 2011-06-01 08:40:47
空指针是啥子东西。指向的是无类型的东西,这是啥子东西额?
...全文
488 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanlaosi 2011-06-04
  • 打赏
  • 举报
回复
谢谢各位的回答,每次都会收到意想不到的结果,就20楼的我做一个回答理解好像有点偏差 void* 表示的是地址所以是4个自己32位的。但是它只是一个数据的首地址,类型没有确定就说明最终的结束地址没有确定所以void*指向的是任意数据类型的,void*万能指针这个理解使我大开眼界,还有就是我试了要用这个东西指针的类型必须强制转换才能被取值。
飞天御剑流 2011-06-04
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 yuanlaosi 的回复:]
.......................类型没有确定就说明最终的结束地址没有确定所以void*指向的是任意数据类型的,void*万能指针这个理解使我大开眼界..................
[/Quote]

所谓void*指向任意数据类型是对隐式转换的误解,void就是一种类型,void*只指向一种类型,就是void,而不是指向任意类型,一个指针指向什么东西要视其类型,而不是隐式转换的结果。关于void是什么35楼已经列出了标准的内容,不再重复。
simengru 2011-06-02
  • 打赏
  • 举报
回复
void*的用法很牛的````
下面这个函数是linux中内核空间到用户空间的拷贝函数
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
{
if (access_ok(VERIFY_WRITE, to, n))
n = __copy_to_user(to, from, n);
return n;
}
注意里面的两个形式参数都是void* 如果不是void*的话 这个函数就会变成一个彻头彻尾的鸡肋.
如果没懂 在回头理解一下25楼.
微笑的鱼 2011-06-02
  • 打赏
  • 举报
回复
void* is God,it can be anything.
pengzhixi 2011-06-02
  • 打赏
  • 举报
回复
The void type comprises an empty set of values; it is an incomplete type that cannot be completed.

A pointer to void may be converted to or from a pointer to any incomplete or object
type. A pointer to any incomplete or object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer
z8323664 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 huanghe_huanghe 的回复:]
引用 4 楼 harry_lyc 的回复:

无类型的指针,可以指向任何数据类型,并转换为该类型
+1
[/Quote]
+2 但是不能对其进阶赋值操作
flysnowhite 2011-06-02
  • 打赏
  • 举报
回复
万能指针,可以指向任意数据类型的指针。但反向需要强制转换。
Athenacle_ 2011-06-02
  • 打赏
  • 举报
回复
void* 可以转化成任意类型的指针,,,
void 指针不可以加减,因为编译器不知道他的大小
firefoxbug 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 supermegaboy 的回复:]

void*不是空指针,它指向的也不是无类型,这是对void和void*的误解。

void本身就是一种类型,它属于不完整类型。void的意义是空对象,等价的说法是无对象。一个指向void的指针并不是空指针,空指针指的是没有引用的指针(这里说的引用不是指C++中的引用类型,而是对实体的引用,void也是实体),但void*是有引用的,只不过引用的是空对象。

什么是空指针呢?指针值为NUL……
[/Quote]
++另外补充点,void *其实这样理解,它是所有各种指针的范称,你可以将任意的指针都赋值个他
比如char *p;void *x;x = p;为什么能这样呢?首先在32位操作系统上任意指针大小都是4字节,你可以用
sizeof(void *)测试。指针其实也就是一个变量,这个变量里面存的都是4字节(32位)的整数。只是变量地址指向的内容各有差异吧了。
CppCoder 2011-06-02
  • 打赏
  • 举报
回复
我主要用VOID保存编译时不能确定类型的变量
elltrack 2011-06-02
  • 打赏
  • 举报
回复
要是能给个相关的程序就好了,这样我们这些初学者可能理解的更好点。
huoxing825 2011-06-02
  • 打赏
  • 举报
回复
void本身就是一种类型,它属于不完整类型。void的意义是空对象,等价的说法是无对象。一个指向void的指针并不是空指针,空指针指的是没有引用的指针(这里说的引用不是指C++中的引用类型,而是对实体的引用,void也是实体),但void*是有引用的,只不过引用的是空对象。

什么是空指针呢?指针值为NULL的指针才是空指针,这个指针值叫空指针常量,它表示这个指针不引用任何实体,包括void。
pathuang68 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuanlaosi 的回复:]
空指针是啥子东西。指向的是无类型的东西,这是啥子东西额?
[/Quote]

简言之,void*是可以用于指向任何数据类型的指针
aozhi 2011-06-02
  • 打赏
  • 举报
回复
万能指针,可以存各种类型的地址。
My_Love 2011-06-02
  • 打赏
  • 举报
回复
//接上
*p = y; //不可以
*q = y;//可以,但逻辑上可能有问题
*z = y;//可以
AnYidan 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 supermegaboy 的回复:]
void*不是空指针,它指向的也不是无类型,这是对void和void*的误解。

void本身就是一种类型,它属于不完整类型。void的意义是空对象,等价的说法是无对象。一个指向void的指针并不是空指针,空指针指的是没有引用的指针(这里说的引用不是指C++中的引用类型,而是对实体的引用,void也是实体),但void*是有引用的,只不过引用的是空对象。

什么是空指针呢?指针值为NULL……
[/Quote]

void -- 无类型指针 --〉不分类型的指针 --〉通用类型指针 --〉可以指向任何对象的指针,但不可以解引用,当你无法确定指针类型时的一种权宜之计
My_Love 2011-06-02
  • 打赏
  • 举报
回复
//void用在参数上表示无参数/无返回值。
//void用在指针上表示任意类型。
void *p;
char *q;
int *z;
int y = 100;

z = &y;

p = z;//可以
q = z; //不可以
q = (char *)z;//可以

z = p; //不可以
z = q;//不可以
z = (int *)p;//可以
z = (int *)q;//可以

p = NULL;//可以
q = NULL;//可以
z = NULL;//可以
biegaoshuwoya 2011-06-02
  • 打赏
  • 举报
回复
void * 通用型指针,,,,,,
赵4老师 2011-06-02
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
fondax 2011-06-02
  • 打赏
  • 举报
回复
看不懂,围观一下
加载更多回复(21)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧