void类型指针在程序当中用途有哪些阿?

kialo 2004-10-20 07:17:43
主要是平时老看到有void类型指针。
望高手赐教。赫赫
...全文
607 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjldleebobby 2004-10-22
  • 打赏
  • 举报
回复
楼上的乃高人也,比我们学校专门讲汇编的老师都厉害!佩服,同时对dog-in-yellow表示敬意!
dog_in_yellow 2004-10-22
  • 打赏
  • 举报
回复
计算机是根据变量的类型来识别的。先不说指针变量,就说这种:int a; double b;
若有如下语句:a=1;b=2; a占了4byte,b占了8byte,计算机要知道必须把1放到a里面的四个bytes里面,2放进b的8byte里面。就是根据变量的类型了。 在编译器编译程序的时候,有个过程就是把c代码转换成汇编代码,在转换成汇编代码后,汇编语言已经没有int、double这个概念了,所以这时已经根据变量类型不同做了取值或赋值需要几个byte的处理了。
举个例子:比如int a; a=5;这两个语句转换成汇编代码变成9:mov dword ptr [ebp-4],5这样一个move的常量到内存的数据传送指令。ebp-4就是a在内存中的地址,是个32位地址值,指令里面那个dword就是告诉计算机要把5送到ebp-4开始的4byte里面。
而double a; a=0;换成汇编代码变成:
00401028 mov dword ptr [ebp-8],0
0040102F mov dword ptr [ebp-4],0
这样两个指令,因为double有8byte共64位二进制,在32位的机器上要分两次进行数据传送,每次传送32位。

至于指针变量原理是一样的,都是根据变量的类型来知道必须连续取几个存储单元。每个变量本身都存储在内存中,他所在的存储单元也有个地址。指针变量和非指针变量在访问变量的区别就在于,非指针变量直接访问该变量的地址那个存储区域,而指针变量范围的是该变量的那个地址里面放的内容(指针变量的内容是个地址)所指的存储区域的值。


yangfasheng 2004-10-22
  • 打赏
  • 举报
回复
dog_in_yellow(dog.in.yellow) ( ) 信誉:100
比如:char *ch="";
int *a;
double *b;
a,b都只是一个地址值,但a指向的内容是从地址a开始向后的四字节数据(int变量占四字节),而b却是从地址b开始的八字节数据(double变量占8字节)。
===================================================================
有一点想请教:
曾见过:所有类型的指针,它所存放的都是十六进制格式的地址,
那么该指针应该如何来说明在取数时,应该连续读取几个存储单元呢,
如上面的,ch 要读一个单元,
a 要连续读4 个单元,
b 要连续读8 个单元
请大侠指点计算机是如何识别的?
an9ryfr09 2004-10-22
  • 打赏
  • 举报
回复
学到了不少东西,谢谢楼上几位
dog_in_yellow 2004-10-22
  • 打赏
  • 举报
回复
呵呵,不敢当啊,或许是你学得多了,进步了,所以现在理解起来比以前容易多了啊
LoveCreatesBeauty 2004-10-22
  • 打赏
  • 举报
回复

函数不是变量,但它却具有物理地址,而且该地址可以赋值给一个指针。这个地址是函数的入口点,且是函数调用时使用的地址。K&R C上说 void * 是通用指针,任何类型指针都可以转换为通用指针,再转换回原来的类型时不会丢失信息,是安全的。C语言参考说 void * 可以用作通用对象指针,但没有通用函数指针。因为要保证函数指针的参数具有函数要求的正确类型。但是 void * 只记载地址,已经不关心类型信息。正如 K&R C中说的,我们可以再转换回原来类型的函数指针,调用它,不会出错。
LoveCreatesBeauty 2004-10-22
  • 打赏
  • 举报
回复
//http://www.cnblogs.com/lovecreatesbeauty/archive/2004/10/22/55284.html

#include <iostream>
using namespace std;

void f(void * p);

int main()
{
void * p;
cout << p << endl;

p = f;
cout << p << endl;

void (*pf)(void *);
pf = (void (*)(void *))(p);
pf("hello");

return 0;
}

void f(void * p)
{
char * str = (char *)p;
cout << "Function f(): " << str << endl;
}

----------------Result in Ms VC6----------------
CCCCCCCC
0040124E
Function f(): hello
great_chenliang 2004-10-21
  • 打赏
  • 举报
回复
>这个指针名头很大,叫通用指针。任何类型指针都可以转换为通用指针,再转换到原类型指针。这种转换不会丢失信息,是安全的。

除了函数指针
sad_4978 2004-10-21
  • 打赏
  • 举报
回复
可以指向任何類型的變量。只是指向地址,但不能修改地址中的值。
jzg1234 2004-10-21
  • 打赏
  • 举报
回复
指针是个好东东 啊!!!
路过~~~
dog_in_yellow 2004-10-21
  • 打赏
  • 举报
回复
程序运行时代码(函数)和数据(变量)都是在内存中的,内存的每个byte都用一个地址来编号,虽然编程时使用的是逻辑地址,但地址编号和物理地址还是一样的。 要执行一个函数,就要知道从内存的哪个地址开始执行,要取一个变量,就要知道这个变量放在内存的哪里。 指针就是用来表示它们的起始地址了。不管是int,double,float或其它类型的指针,指针的大小都是一个的,就是一个地址值,来指示所要取的数据的起始地址。不同类型指针的区别在于它所指向的内容的范围不一样。
比如:int *a;
double *b;
a,b都只是一个地址值,但a指向的内容是从地址a开始向后的四字节数据(int变量占四字节),而b却是从地址b开始的八字节数据(double变量占8字节)。
如果你写成: void *c;
那就是没有类型的指针,它和a,b都一样,也是个地址,但是程序不知道它所指向的数据到底有几个字节了。所以使用c的内容时就要进行指针类型的转换。
2004-10-21
  • 打赏
  • 举报
回复
Up
jiangcg2 2004-10-21
  • 打赏
  • 举报
回复
函数指针跟数据指针是一回事,都是指像内存中某个区域的数据,你好好学学汇编语言,函数指针就不难理解了。
jalang 2004-10-21
  • 打赏
  • 举报
回复
>除了函数指针
函数指针是个什么名堂??一直不太清楚.可否告知?1
greenteanet 2004-10-21
  • 打赏
  • 举报
回复
同意楼上的。
ninansky 2004-10-20
  • 打赏
  • 举报
回复
up
LoveCreatesBeauty 2004-10-20
  • 打赏
  • 举报
回复
这个指针名头很大,叫通用指针。任何类型指针都可以转换为通用指针,再转换到原类型指针。这种转换不会丢失信息,是安全的。

建议楼主到signal.h中看看signal的原型,有了收获再来散分。

void (*signal(int sig, void (*func)(int)))(int);
lynnboy 2004-10-20
  • 打赏
  • 举报
回复
用处就是保存一个地址,至于怎么用这个地址,按你的需要cast就行了
jzg1234 2004-10-20
  • 打赏
  • 举报
回复
只是存储一 个地址什么类型都不是,我觉得是可以改为其他类型的!
个人观点,望牛人指教

69,322

社区成员

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

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