指针小记_1

指针小记_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

你可能感兴趣的:(指针小记_1)