我的CPP之路

路漫漫其修远兮
随笔 - 42, 文章 - 0, 评论 - 16, 引用 - 0
数据加载中……

指针小记_1

没玩过void *,玩一下试试。

#include <cstdlib>
#include 
<iostream>

using namespace std;

typedef 
struct test{
    
int dataA;
    
char *dataB;        
}
test;

void *pointer;

int main(int argc, char *argv[])
{
    test mytest, 
*pmytest, **ppmytest;
    pmytest 
= &mytest;
    
//ppmytest = &(&mytest); // non-lvalue in unary `&' 
    ppmytest = &pmytest;
    pointer 
= ppmytest;
    mytest.dataA 
= 1;
    cout
<<"pmytest:\t\t"<<pmytest<<'\n';
    cout
<<"pmytest->dataA:\t\t"<<pmytest->dataA<<'\n';
    cout
<<"(*ppmytest)->dataA:\t"<<(*ppmytest)->dataA<<'\n';
    cout
<<"(*(test **)pointer)->dataA:\t"<<(*(test **)pointer)->dataA<<'\n';
    
//cout<<((test *)(*pointer))->dataA<<'\n'; //`void*' is not a pointer-to-object type 
    cout<<"ppmytest:\t\t"<<ppmytest<<'\n';
    cout
<<"pointer:\t\t"<<pointer<<'\n';
    
//pointer++; //ISO C++ forbids incrementing a pointer of type `void*' 
    pointer = (char *)pointer + 1;
    cout
<<"pointer:\t\t"<<pointer<<'\n';

    system(
"PAUSE");
    
return EXIT_SUCCESS;
}


果然为通用指针,到处指,直接把二级结构指针赋给void *,呵呵。
第一行注释:错误原因,&取的是变量的地址,(&mytest)不是变量,只是一个地址值。
第二行注释:错误原因,这种转换似乎不行,上面一行代码先转换成2级指针,再取值得一级指针,这行。
第三行注释:错误原因,void *不能“直接”进行算术运算。标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。所以,下一行先转换为char *,就可以了。

以上代码在gcc 3.4.5 中编译通过,结果如下:

pmytest:                0x23ff70
pmytest->dataA:            1
(*ppmytest)->dataA:      1
(*(test **)pointer)->dataA:     1
ppmytest:               0x23ff6c
pointer:                0x23ff6c
pointer:                0x23ff6d

posted on 2008-03-08 11:20 yanvenhom 阅读(686) 评论(2)  编辑 收藏 引用 所属分类: C/C++

评论

# re: 指针小记_1  回复  更多评论   

第一次发现void * 还有这种功能
2008-03-08 22:14 | passerby

# re: 指针小记_1  回复  更多评论   

@passerby
其他指针之间转换大多都会产生编译错误,void *随便来的。
2008-03-09 16:44 | yanvenhom

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理