二维数组地址,指针数组,数组指针,数组传参分析,int *p1[3]  ,int (*p2)[3]

一、定义变量

  int a[10]={0,1,2};

  int array[2][3]={0,1,2,3,4,5};

  int *p1[3];//p1是数组,和普通数组一样,只不过里面存的是int *指针;p1数组名为常量不能++

  int (*p2)[3];//p2是指针,指向int类型列为3的数组(也就是行地址);p2为变量可++

 

二、调试查看

通过vs调试查看变量类型(int *[] 表示数组里是指针,int []*表示数组地址 )

  int *p1[3]   --> int *[3]

  int (*p2)[3] --> int [3] *

  array     -->int [2][3]

  &array  -->int [2][3] *

  array+0--> int [3] *    值:0x001bf884 //行地址  

  array+1 -->int [3] *    值:0x001bf890

  /***********************************************/

  array[0] -->int [3]  值:0x001bf884     //虽然值一样,类型不同。

  array[1] -->int [3]  值:0x001bf890

  (array+0)[0]  -->int [3]  值:0x001bf884 指向 0 1 2

  (array+0)[1]   -->int [3]  值:0x001bf890 指向 3 4 5

  (array+1)[0]  -->int [3]  值:0x001bf890

  (array+1)[1]  -->int [3]  值:0x001bf89c //指向 其他值,已经越界。

  这里说明(1)或[1]里面每加1指针偏移12位即12字节,3个int,array带有指向一行三列的信息

  /***********************************************/

  *(array+1)[0]=3

  *(array+1)[1] =-858993440//越界

 

三、总结:

a)到这就可以看出

  int (*p2)[3] --> int [3] *

  array+0--> int [3] *    

  array+1 -->int [3] *    

  类型一致,可以赋值

  int (*p2)[3]=array;    //可以通过p[0][0]到p[1][2]打印出0-5

  int (*p2)[3]=array+1;//可以通过p[0][0]到p[0][2]打印出3-5

也就是说我们可以通过数组指针为形参传递二维数组

如 void print( int (*p2)[3])   调用print(array);

而我们平时二维数组传参场用方法

void print( int p2[2][3]) 

void print( int p2[][3]) 其实就是 int (*p2)[3]的形式,第一个行[2]没有意义

 

b)至于int *p1[3],就是普通的数组,所以初始化、赋值方式也一致

初始化 int *p1[3]={a,a+2}

赋值   p1[0]=a; 使用 p1[0][2]值为2

   或   p1[0]=&a[0][0]; 使用p1[0][2]值为2,p1[0][5]值为5(二维数组看成以为按行排列)

         注意: p1[0]=array -->int [2][3]

                    p1[0]=array[0] -->int [3]

                    p1[0]=&array[0] -->int [3] *

                    都报错 ,不能转换为int *

函数传参也和普通一位数组一样

void print( int *p1[]),调用print(p1)//把指针数组名传入

也即void print( int *(*p1))即void print( int **p1)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值