指针的赋值比较简单,但是粗心的话,还是比较容易弄错,小菜我比较粗心,就在一开始看到以下代码的时候,云里雾里的,一下没看明白为什么要用_Iterator_base ** 来实现这个功能。
void __CLR_OR_THIS_CALL _Orphan_me()
{ // cut ties with parent
if (_Mycont != 0 && _Mycont->_Myfirstiter != _IGNORE_MYITERLIST)
{ // adopted, remove self from list
_Iterator_base **_Pnext =
(_Iterator_base **)&_Mycont->_Myfirstiter;
while (*_Pnext != 0 && *_Pnext != this)
_Pnext = &(*_Pnext)->_Mynextiter;
if (*_Pnext == 0)
_DEBUG_ERROR("ITERATOR LIST CORRUPTED!");
*_Pnext = _Mynextiter;
_Mycont = 0;
}
}
实话说,小弟我琢磨了好一会儿了,才恍然大悟,其实,换个例子相信大家一眼就看出来了
int a = 100;
int b = 200;
int* pA = &a;
int *pB = pA; *pB = 300;
pB = &b; //pA指向的指针肯定是没有变的
以pB为例,与pB对应的有&pB, pB, *pB,三种值,如下
0x0012fee8指pB的地址,这个地址的值是什么呢??我们再看
因为我们事先知道这个地址下是一个指针,在win32下指针32位,按高高低低原则,则这个地址的值是0x0012ff0c,假如这个地址表示的是一个字节如char,则值就是0x0c,如果两个字节,则0xff0c,如果3个字节(。。。需要字对齐吧)。还是因为我们事先知道这个内存是个指针,他的值是0x0012ff0c,那我们继续看看0x0012ff0c的值是多少
因为知道这个地址是int*指针,所以按int解释这个值就是 0x0000 0064 = 100了,
有了这几个图,那就可以看看 *pB = 300; pB = &b到底改变了啥了
断点先断到*pb = 300后,继续看内存,发现执行好这句后
0x12fee8的值没有变,还是0x12ff0c, 0x12ff0c的值变了,变为0x0000012c了
pB = &b?
现在pB内存的值变为0x0012ff00了,而*pB的值就是内存0x0012FF00的值变为 0x000000c8了
好,看图说话到这里了,最后总结一下。初学者,很菜,多关照