我之前对二级指针接触很少,函数传入参数我也比较喜欢使用&而不是*来操作,但是最近在项目代码中发现了如下代码
int *a = new int(1);
int *b = new int(2);
*(void**)a = b
最开始,我百思不得其解,这到底是是啥意思,难道与*a=b不等效吗?但是明显*a=b是编译失败的,然后,???
别问,问就写demo,talk is cheap, show me the code。接下来,咱们写几行代码看看:
int *a = new int(3);
int *b = new int(4);
*(void**)a = b;
cout << a << ": " << *a << " " << *((int*)(*a)) << endl;
cout << b << ": " << *b << endl;
输出结果如下:
这时候,惊奇的发现,*a居然和b指针指向的内存地址是一样(0x00BB9B00=12294912)
咱们再根据这个结果,来理解一下*(void**)a = b,在32位机器下,含义其实与*a=(int)b是一样的,就是把b指针指向内存的首地址赋值给a指针指向的内存。
但是怎么从语法上来解释,暂时我也不知道,待学习...