请教void*

ssbelle 2002-08-17 11:18:48
这是《thinking in c++》里的一段话:c++允许将任何类型的指针赋给void* (这是void*的最初的意图,它要求void*足够大,以存放任何类型的指针),但不允许将void*指针赋给任何其他类型的指针。
我发现以我的能力并不能从上面这段话里看出void*是个什么概念,在示例里有这样的例子:
void* data (书上的印刷是这样的,不过应该是 void *data 吧)
void* peak()
void* pop()
还有一个 Link* next 不知道是什么东西。
还有一句代码是这样的:

void* v=
realloc(s->storage,(s->quantity+increase)*s->size);
不知道为什么要在=后面再另起一行?
看样子void*后面可以跟变量名,可以跟函数名,象是一个定语一样。
我只知道在c里void是个加在函数名前面说明此函数是无返回值的关键字。
请赐教!
多谢!
...全文
197 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mayaaaaa 2002-08-19
  • 打赏
  • 举报
回复
primer中说:
void*表明相关的值是个地址,但该地址的对象类型不知道。我们不能够操作空类型指针所指向的对象,只能传送该地址值或将他与其他地址值作比较。
cwanter 2002-08-19
  • 打赏
  • 举报
回复
我觉得你还是别看这本书,第一听说这本书翻译的比较差,第二点(主要一点)你现在的水平看这本书有点累,看《c++ prime》吧。看完后你就脱胎换骨了。
julyclyde 2002-08-19
  • 打赏
  • 举报
回复
还有:确实是void*而不是void *
*和类型符号合在一起
earthharp 2002-08-18
  • 打赏
  • 举报
回复
指针就是地址,之所以有类型是因为他必须有含概的内存区。
所有类型的指针都一样,只是含概的内存区不同。你可以随意的转换指针类型(可以用cast,只要你不怕出问题)。
benny29a 2002-08-18
  • 打赏
  • 举报
回复
真没劲,没分加,早知道就不说这么多了!:(
benny29a 2002-08-17
  • 打赏
  • 举报
回复
看一下The C++ Programming Language这本书吧,它有说的,不过Stroustrup说,尽量不要用void*,因为编译器对它不做类型检查,用它会降低安全性的;void* data和void *data是一样的,另起一行只不过书写的问题
有分加吗?
NickTang 2002-08-17
  • 打赏
  • 举报
回复
关于指针,有两个地方系统应该知道的,一个是这个指针指向的地址,其实就指针的内容,另一个是如何解析这个地址中的内容。比如同样大小的两个结构,可能包含的内容不同,所以指针需要知道自己指向的地址的内容的结构。但是有的时候你没有办法确定指针的地址的内容的结构是什么样的,那么就有了一个void*的概念,就是说你不知道它的结构,或者不关心它的结构,比如malloc函数,malloc没有办法知道你申请的内存的结构,所以它返回一个void*,而由你进行动态的转换。
void* data;和void *data;的作用是完全相同的.
Link* next;Link应该是一个结构,说明next是指向这个结构的一个指针。这样写的目的一般是为了链表。
void* 后面跟一个变量名,声明一个可以指向任何类型的指针。不过在使用的时候,必须动态转换。
void*加在函数名前面,并非说明此函数是无返回值的,而是返回一个指针,只不过不确定这个指针的类型。
wiler 2002-08-17
  • 打赏
  • 举报
回复
C++里面允许这样定义void* var;
而C里面只能这样定义void *var;即void必须跟*隔开
Link是一个已经定义的结构,请好好看书
另起一行也没什么不行的,当然最好是同一行了,可能印刷问题吧
void *var;//表示这是一个没有固定类型的指针
n5 2002-08-17
  • 打赏
  • 举报
回复
c++中void*是通用指针,c\c++中允许隐式地将一个指针转换为void*类型:
void *v ;
int *f ;
v=f ;
c中允许隐式地将void*转换为其他任何类型的指针,但c++中需要一个显示的类型转换:
f=(int *)v ;

你好像对程序的书写格式很在意,其实那个另起一行并没有什么含义,我想可能是
印刷问题吧,一般书写格式反映了程序员的思维方式,比如 void* data ;
void *data; void * data; 在语法上都是一样的,但是有些程序员喜欢将指针
看作是一种类型,因此他们用void* data ;
mzz_810 2002-08-17
  • 打赏
  • 举报
回复
指针是一种很灵活的东西,对同一个指针用不同的类型去访问可方便程序员,但使用时要小心,如下例:
struct ifnet {
char *if_name;
... ...
int (*if_output)(struct ifnet *, struct mbuf *, ... ...
};
struct arpcom {
struct ifnet ac_if;
u_char ac_enaddr[6];
struct in_addr ac_ipaddr;
struct ether_multi *ac_multiaddrs
int ac_multicnt;
};
static void
arprequest(ac, sip, tip, enaddr)
register struct arpcom *ac;
register u_long *sip, *tip;
register u_char *enaddr;
{
... ...
(*ac->ac_if.if_output)(&ac->ac_if, m, &sa, (struct rtentry *)0);
}
这是以太网接口数据结构,它的第一个成员是标准的ifnet结构,在调用输出函数if_output时,将ac_if传递给输出函数,而if_output是指向ether_output的函数指针,ether_output定义如下:
int
ether_output(ifp, m0, dst, rt0)
register struct ifnet *ifp;
struct mbuf *m0;
struct sockaddr *dst;
struct rtentry *rt0;
{
... ...
struct arpcom *ac = (struct arpcom *)ifp;
... ...
}
在ether_output函数里,又通过对ifp的强制类型转换得到arpcom结构。

以上的代码源自以太网标准协议栈BSD源码。

另外,在基本的链表操作中也用到了以上相似的功能……
swimmer2000 2002-08-17
  • 打赏
  • 举报
回复
谭浩强的<<c语言程序>>中有很详细的介绍
chen_jiazhi 2002-08-17
  • 打赏
  • 举报
回复
“不允许将void*指针赋给任何其他类型的指针。"那么
void *v ;
int *f;
f=(int *)v ,是不是又问题?

ssbelle 2002-08-17
  • 打赏
  • 举报
回复
呵呵,大家可不要晕,我是新来的,不知道加分是怎么回事。

69,377

社区成员

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

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