C++博客 联系 聚合 管理  

Blog Stats

随笔分类

随笔档案

习惯成自然

helloworld

指针的赋值比较简单,但是粗心的话,还是比较容易弄错,小菜我比较粗心,就在一开始看到以下代码的时候,云里雾里的,一下没看明白为什么要用_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,三种值,如下

3

0x0012fee8指pB的地址,这个地址的值是什么呢??我们再看

4

因为我们事先知道这个地址下是一个指针,在win32下指针32位,按高高低低原则,则这个地址的值是0x0012ff0c,假如这个地址表示的是一个字节如char,则值就是0x0c,如果两个字节,则0xff0c,如果3个字节(。。。需要字对齐吧)。还是因为我们事先知道这个内存是个指针,他的值是0x0012ff0c,那我们继续看看0x0012ff0c的值是多少

5

因为知道这个地址是int*指针,所以按int解释这个值就是 0x0000 0064 = 100了,

有了这几个图,那就可以看看 *pB = 300; pB = &b到底改变了啥了

断点先断到*pb = 300后,继续看内存,发现执行好这句后

7

6

0x12fee8的值没有变,还是0x12ff0c, 0x12ff0c的值变了,变为0x0000012c了

pB = &b?

9

10

 

现在pB内存的值变为0x0012ff00了,而*pB的值就是内存0x0012FF00的值变为 0x000000c8了

好,看图说话到这里了,最后总结一下。初学者,很菜,多关照

posted on 2010-11-02 00:23 坏习惯 阅读(2314) 评论(0)  编辑 收藏 引用 所属分类: c++

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