一、二级指针
int a1=10,a2=11,a3=12;
int *p1=&a1,*p2=&a2,*p3=&a3;
int **s=&p1;//声明s为二级指针,里面存放的是p1的地址
ex:
*(*(P+8)+8)=5;//p[8][8]=5;
顶级理解:
哈哈哈,由一维数组a[0]=*(a+0);此处为a为数组首地址,类推可得:
*(p+8)=p[8];
*(p[8]+8)=p[8][8];
二、数组指针
int ar[10]=nullptr;
int *s[5];//定义了5个指针变量的数组
int (*s)[5]=&ar;//数组指针必须包含数组类型,元素个数
三、二维数组
首先二位数组的元素是一维数组。二位数组在内存中实际上是以一个个一维数组连续存放的。
int ar[2][3]={1,2,3,4,5,6};
int (*s)[3][4]=&ar;//必须知道数组的元素类型,元素个数
int (*p)[3]=ar;//ar为二维数组首元素地址
当函数重要利用二维数组作为形参时,二维数组同样也会退化为数组
ex:
//要求依次输出二维数组每个元素
void fun(int (*br)[5],int row,int col)//利用二维数组作为形参的时候,用首元素地址作为形参
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("%d ",br[i][j]);
}
printf("\n");
}
}
int main()
{
int ar[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,51};
fun(ar,3,5);
}