关于C++指针的研究

来源:互联网 发布:linux修复 内核升级 编辑:程序博客网 时间:2024/06/05 16:46

    这2天,为了应付实习公司的面试,要求我在windows下写一个俄罗斯方块出来

    以前用j2me写过一个俄罗斯方块,基本算法和数据结构都有一定的考虑了,可动手开写的时候C++的指针很是把我郁闷了一阵,特别是关于数组的指针和指针数组等,一多了就搅在一起搞不清楚,昨天花了一下午基本上算是搞懂了,在这里做个总结,也算是对的起自己一下午的劳动

    int  one[2] ={2,3}

       cout<<one<<&one<<*one<<endl

       得到的结果是0x0013FF34  0x0013FF34  3,这里 b 和 &b的值是一样的.

       但是如果用一个指针来指向它,如下

       int * pone =  one;

       cout<<pone<<"  "<<&pone<<"  "<<*pone<<"  "<<endl;

       得到的结果是0x0013FF34  0x0013FF3C  3, pone和&pone就不一样了,如我们所期待的一样.

       这里就可以得到一个结论,打印数组名得到的是数组的起始地址,而打印&数组名得到一样的结果.但是这不能理解成 one = &one.我们可以用如下方式证明:

       pone = one ;//success

       pone = &one; //failed,因为&one 实际是一个 int (*)[2]指针,它不能转换成int *.

       pone = *&one;//success

       这样,我们可以知道&one 是一个int (*)[2]指针,*&one则是一个int* 指针,**&one则会得到3,因此,我们还可以使用*&one[0] 来访问one[0],*&one来访问one[1];

       现在,我们来定义一个int (*)[2] 的指针,如下:

       int (*ppone)[2] = &one; //success

       cout<<ppone<<"  "<<&ppone<<"  "<<*ppone<<"  "<<**ppone;

       输出如下:0x0013FF34  0x0013FF30  0x0013FF34  3,这里我们可以看到,ppone 与 &ppone 也是不相同的,  但ppone 与 *ppone相同,这是为什么呢?我猜想可能是因为ppone = &one,而*ppone = *&one = one,而前面我们已经看到one 和 &one 的输出是一样的,因此这里ppone 和 *ppone也得到了一样的输出,但是要注意它们2个一个是int (*)[2],一个是int *,是不一样的. 

      最后我们看一下

      cout<<&ppone[0]<<&ppone[1];

      输出为  0x0013FF34  0x0013FF3C,这是因为ppone是一个int (*)[2],因为它每次加1都要跨越2个int的长度.

       ok,休息一下,下一篇准备接着总结多维数组.

原创粉丝点击