关于指针这块,有段时间没有接触了(因为最近都是在使用java),感觉有点生疏了,昨天同学问了关于一个指针的问题,当时竟然卡住了,好吧,还是基础不够牢靠啊,突然觉得掌握了东西还是要以某种形式记录下来,光靠记忆还是不行,不能懒惰,所以把昨天的问题总结下。
昨天同学的问题如下:
int ** p_point;
p_point = new int*[2];
问new右边的是什么意思,如果写成new (int*)[2]又会怎样?
第一种写法(new int*[2]):正确的,因为它表示的是申请了一个长度为2数组,数组中存放的是指向int型的指针;
第二种写法(new (int *)[2]):错误的,它表示的是指向数组的指针,该数组是一个长度为2的int型数组,编译器是不支持这样申请空间的。
(1)int ** pp; 表示指向指针的指针;(指针的指针)
(2)int *p[3]; 表示一个长度为3的数组,数组中存放的是指向int型的指针;(存放指针的数组)
(3)int (*p)[3]; 表示p是一个指针,指向一个长度为3的int型数组;(指向数组的指针)
如何证明上面关于存放指针的数组和指向数组的指针说法的正确呢?通过对p的地址进行+1,来查看p+1和p的地址相差值就可以明了。(32bit编译器)如果相差4,说明是存放指针的数组,如果相差4*3(这里是3,也就是所指向的数组的长度),程序如下:
int (*p)[3];
p = new int[2][3];
int i = 1,j = 2;
int *pb[2] = {&i,&j};
printf("指向数组的指针: %x, %x\n",(p+1),p);
printf("存放指针的数组: %x,%x\n",(pb+1),pb);
运行结果如下:
以上乃个人理解,如有不对,望请指出,不甚感激。