多级指针:
int main(){
//指针数组里面元素存储的是指针
int a[] = {1, 2, 3};
int b[] = {4, 5, 6};
int c[] = {7, 8, 9};
//指针数组是一个特殊的二维数组模型
//指针数组对应于二级指针
int *arr[] = {a, b, c};
//指针数组和二级指针建立关系
int **p = arr;
//arr[0][0] a[0]
printf("%d\n", **p);
//二级指针加偏移量 相当于跳过了一个一维数组大小
// printf("%d\n",**(p+1));//打印b数组的第一个元素
//一级指针加偏移量 相当于跳过了一个元素
printf("%d\n", *((*p +1)));//打印a数组第二个元素
printf("%d\n", *(*(p+1)+1));//打印b数组的第二个元素
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("");
}
}
int main(){
int a = 10;
int b = 20;
int *p = &a;
int **pp = &p;
int ***ppp = &pp;
//*ppp == pp == &p
//**ppp == *pp == p == &a;
//***ppp == **pp ==*p ==a;
//**pp = &b;//等价于p = &b
//不懂就用下面注释正推或者反推
//pp 二级指针的值
//*pp 二级指针的地址
//**pp 一级指针的值
//所以这里的p就相当于&b
**pp = 100;
printf("%d\n", *p);//100
printf("%d\n", a);//100
return 0;
}
C语言中的*和&
int main(){
//定义变量a = 10;
int a = 10;
//猜想 既然*能加多个 那么&是否能加多个呢?
//***p是三级指针,应该对应二级指针地址 &a为一级指针 那么&&&a是不是就为三级指针呢?
//如下式子
int ***p = &&&a;//err
//结论:不能,报语法错误,指向的地址没有储存,缺少了中间相关联的媒介 不能有多个&
}