让一维指针指向二维数组空间的方法!

背景:int *p;int a[10][10];如何让一维指针p指向a[10][10]开辟的内存空间?

正确的方法:

        1.开始我用的笨方法是另外开辟一个内存空间int*p=new int [100];

          for(int i=0;i<10;i++)

             {

                 for(int j=0;j<10;j++)

                  {

                         *p=a[i][j];

                           p++;

                   }

             }

         p=p-100;

        这样就另外开辟了100的内存空间,并让p指向了,这个内存区间的起始地址

         2.直接p=&a[0][0];

         3.p=a[0];这样也行,确实让人费解

         4.p=(int*)a;

错误的方法:

           p=a;//二维数组的数组名,表示一个指向列值个元素的一维数组的指针变量

拓展方法:

         从上面可以看出,这些指针本质上都是指向一种类型(整型的指针),他们之间的转换无非是强制转换,这样都不会有问题,结论就是同类型指针同维数指针之间强制转换都不会有问题,

下面的方法:

     int(*pa)[10]=null;

     int **pab=(int**)pa;//这里编译没问题,运行有问题

     int *p=(int*)pa;//这样编译没问题,运行也没问题,相当于二维转一维

     p=(int *)pab;//编译没问题,运行没问题,二维转一维

   从上面可以看出,二维指针之间强制转换会出现不可知的问题,而二维强制转一维都不会有问题!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值