这个语句什么意思?关于Void** 本帖最后由 slowgrace 于 2009-09-19 11:02:59 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 *(void**)pDst = (void*)pSrc对这类的转换比较迷糊,大概是这样的:(void*)pSrc是将pSrc转换为void类型的指针。*(void**)pDst,先是(void**)pDst,然后再对(void**)pDst做取值运算。(void**)pDst也是将pDst转换为void类型的二级指针,在VB里你可以把(void**)pDst考虑成字符串指针。对字符串指针求值就得到了字符串数据的真实地址。 在C/C++中 void* 代表任意类型指针, void** 代表指针的指针,也可以理解为指向指针的指针。 你这段代码的实际意思是为 拷贝或者转换指针地址的意思。用实际C++ 代码可以还原出这段代码的意思。 int a = 100;int b = 200;int c =0;void *pv = (void*)&a; // p = a 的指针void **ppv = &pv; // ppv = a 的指针地址c = *(*ppv) ; // c=100, int *p1 = &b; // p1 = b的指针*ppv = (void*)p1 ; // 这时 ppv = b的指针的地址 等同 *(void**)ppv = (void*)p1;c = *(*ppv) ; // c = 200 **是传说中的“指针的指针”,即该指针变量中所保存的内容是另一个指针。理解的时候,可以先抛开括号中用于表示强制类型转换的内容,单独这样看*pDst = pSrc。*(void**)pDst = (void*)pSrc || || \/ *(类型2)pDst = (类型1)pSrc || || \/ *(指向“void类型指针”的指针)pDst = (void类型指针)pSrc || || \/ 将“指针pSrc的值”保存到“指针pDst所指向的内存区域”中,因为pDst是指针,而*pDst中保存的内容也是一个指针,因此pDst的类型就是指针的指针,即void** 谢谢豆子,明白了。同一内容发了两个帖,有点晕。想起来那个同时和两个世界冠军下象棋的ANYWAY,你们就不能回一下那边的帖子么?我连续回复3次不能发言了。 谢谢胡侃的详细解释,用这个思路来理解问题挺好的。不过,有一点我好像和你理解的不一样:int b=200;/****你的理解****/int *p1 = &b; //(void *)b 相当于先用这个语句得到一个整型指针(void *)p1 //再将这个整型指针转化为void *指针/****我的理解****/int *p1 = b; //(void *)b 相当于先用这个语句得到一个整型指针(void *)p1 //再将这个整型指针转化为void *指针其实也就是这个帖子10楼的疑问。如果pSrc是long型变量,那(void*)pSrc是表示下面哪个意思: (1)把pSrc的值当做一个指针。该指针的内存地址等于pSrc的值 (2)还是把pSrc的地址取出来当做一个指针?该指针的内存地址等于pSrc的地址。我觉得是(1),你觉得是(2)。 19楼的代码用错语法高亮了,重贴一下。int b=200;/****你的理解****/int *p1 = &b; //(void *)b 相当于先用这个语句得到一个整型指针(void *)p1 //再将这个整型指针转化为void *指针/****我的理解****/int *p1 = b; //(void *)b 相当于先用这个语句得到一个整型指针(void *)p1 //再将这个整型指针转化为void *指针 CANON新打印机曝料:低端打印很少使用彩色打印。 datagrid 控件为何这样还是不能刷新 降序查询的语句如何 用activereport做报表,多个数据源如何处理呀?我用ado记录集做数据源.一个我会,关键是多个数据源. 唐博士,在吗?各位高手也来指点!关于打印的一个大大大问题! 为什么Datagrid控件没有数据。 工业生产线数据库问题 vb和MSSQL2000怎么建立连接?(菜鸟提问) cashcode纸币器rs232串口通信? 鸟语:如何实现点击一个按钮就能重新运行程序??? 头大,全局热键无法多次使用sendkeys,求高人解决~ 关于VB调用DLL的问题
对这类的转换比较迷糊,大概是这样的:(void*)pSrc是将pSrc转换为void类型的指针。
*(void**)pDst,先是(void**)pDst,然后再对(void**)pDst做取值运算。(void**)pDst也是将pDst转换为void类型的二级指针,在VB里你可以把(void**)pDst考虑成字符串指针。对字符串指针求值就得到了字符串数据的真实地址。
int b = 200;
int c =0;void *pv = (void*)&a; // p = a 的指针
void **ppv = &pv; // ppv = a 的指针地址
c = *(*ppv) ; // c=100,
int *p1 = &b; // p1 = b的指针*ppv = (void*)p1 ; // 这时 ppv = b的指针的地址 等同 *(void**)ppv = (void*)p1;
c = *(*ppv) ; // c = 200
||
\/
*(类型2)pDst = (类型1)pSrc ||
||
\/
*(指向“void类型指针”的指针)pDst = (void类型指针)pSrc ||
||
\/ 将“指针pSrc的值”保存到“指针pDst所指向的内存区域”中,因为pDst是指针,而*pDst中保存的内容也是一个指针,因此pDst的类型就是指针的指针,即void**
谢谢胡侃的详细解释,用这个思路来理解问题挺好的。不过,有一点我好像和你理解的不一样:int b=200;/****你的理解****/
int *p1 = &b; //(void *)b 相当于先用这个语句得到一个整型指针
(void *)p1 //再将这个整型指针转化为void *指针/****我的理解****/
int *p1 = b; //(void *)b 相当于先用这个语句得到一个整型指针
(void *)p1 //再将这个整型指针转化为void *指针
其实也就是这个帖子10楼的疑问。如果pSrc是long型变量,那(void*)pSrc是表示下面哪个意思: (1)把pSrc的值当做一个指针。该指针的内存地址等于pSrc的值
(2)还是把pSrc的地址取出来当做一个指针?该指针的内存地址等于pSrc的地址。我觉得是(1),你觉得是(2)。
int *p1 = &b; //(void *)b 相当于先用这个语句得到一个整型指针
(void *)p1 //再将这个整型指针转化为void *指针/****我的理解****/
int *p1 = b; //(void *)b 相当于先用这个语句得到一个整型指针
(void *)p1 //再将这个整型指针转化为void *指针