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