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

关于指针这块,有段时间没有接触了(因为最近都是在使用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);

运行结果如下:



以上乃个人理解,如有不对,望请指出,不甚感激。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值