二级指针
先来看代码:
int a = 10;
int b = 20;
int* p = &a;
int** pp = &p;
*pp = &b;
printf("%d\n",*p);
输出结果: 20
分析:代码第3行一级指针p存的值是a变量的地址值,代码第4行二级指针pp存的值一级指针的地址值,这里pp指代的是p,故代码第五行pp = &b等价于p = &b,所以结果输出为20。
看图:
由此图类推,多级指针类似。
指针数组与二级指针的遍历
指针数组的遍历:
int a[] = {1,2,3};
int b[] = {4,5,6};
int c[] = {7,8,9};
int* arr[] = {a,b,c};//数组名存的是首元素的地址
for(int i =0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d ",arr[i][j]);//二位数组形式打印
printf("%d ",*(arr[i]+j));
printf("%d ",*(*(arr+i)+j);
}
}
二级指针的遍历:
int a[] = {1,2,3};
int b[] = {4,5,6};
int c[] = {7,8,9};
int* arr[] = {a,b,c};
int** p = arr;
for(int i =0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d ",p[i][j]);//二位数组形式打印
printf("%d ",*(p[i]+j));
printf("%d ",*(*(p+i)+j));
}
puts("");
}
它与指针数组高度类似,二级指针变量p增加偏移量,相当于跳过了一个一维数组的大小,一级指针增加偏移量,先当与跳过了一个元素。