一、定义变量
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)