您的位置:首页 > 编程语言 > C语言/C++

<C/C++>指向指针的指针、指向数组的指针以及存放指针的数组

2014-05-20 18:57 393 查看
关于指针这块,有段时间没有接触了(因为最近都是在使用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);


运行结果如下:



以上乃个人理解,如有不对,望请指出,不甚感激。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: