1、二重指针
声明:int **p;
数据类型:int **
含义:指针的指针
2、二维数组
声明:int p[3][2];
数据类型:int
含义:数组的数组
3、指针数组
声明:int *p[2];
数据类型:int *[]
含义:数组元素为指针
4、指向含有m个元素的一维数组的指针
声明:int (*p)[2];
数据类型:int (*)[]
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
代码验证:分别用指针数组、指针、指向一维数组的指针验证
#include<stdio.h>
int main()
{
int a[3][2]={1,2,3,4,5,6};
// int **p;
// int *p[2]; 错误写法
int (*p)[2]=a; //正确写法1,说明和二维数组指向一维数组的指针含义相同
int *q=a[0]; //正确写法2
printf("%d\n",*(*(p+1)+1));//验证结果
printf("%d\n",*(q+3));//验证结果
}
/*
总结:
一维数组名代表数组首元素的指针
二维数组名代表数组首行的地址,即二维数组名代表的是指针的数组而不是指针的指针
所以双重指针和二维数组没有任何联系
*/