指針小記_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







































果然為通用指針,到處指,直接把二級結構指針賦給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 閱讀(702) 評論(2) 編輯 收藏 引用 所屬分類: C/C++