关于C++指针的研究

    这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,休息一下,下一篇准备接着总结多维数组.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值