指针是C语言的精华,也是很重要的章节。我在学习的时候遇到多级指针的时候也会犯迷糊,最后我稍微发现了一点方法。下面想分享给大家。这篇文章我们通过分析题目、完成多级指针的传参 来讲一下多级指针传参与多级指针解引用,很简单易懂的方法。
多级指针
先来看一段不完整的代码
void func()
{
}
int main()
{
int a = 3;
int b = 4;
int *pa = &a;
int *pb = &b;
int **ppa = &pa;
int **ppb = &pb;
}
思考:
现在我们的要求是使ppa指向pb,那么函数func()中应该怎样传参呢?
思路:让ppa指向pb,就是将pb的地址ppb赋值给ppa。
分析:原先的时候 ppa是指向pa的,现在我们要使它指向pb。改变ppa的指向就是改变ppa的值,要改变一个数的值,就应该传ppa的指针,所以func()函数的第一个参数必须传ppa的地址&ppa; 指向pb,所以第二个参数应该传pb的地址,要能取到pb的值,那么就是ppb。所以void func(int ***pppa, int **ppb)。
那么我们接下来看
void func(int ***pppa , int **pb)
{
*pppa = ppb;
}
这样写,对吗?能否将ppa指向pb ?
我们来验证一下,打印一下**ppa的值,如果ppa指向pb那么 **ppa就是就是*pb的值也 就是b的值4
void func(int ***pppa, int **ppb)
{
*pppa = ppb;
}
int main()
{
int a = 3;
int b = 4;
int *pa = &a;
int *pb = &b;
int **ppa = &pa;
int **ppb = &pb;
func(&ppa, ppb);
printf("%d\n", **ppa);
system("pause");
}
答案正确。结果就是4。 把ppb的地址给了ppa。
原因: ----- 在搞不懂问题的时候将图画出来,分析问题,更加清楚明白
那么我们那么我们要求将func函数改一下。
void func(int ***pppa, int **ppb)
{
**pppa = *ppb
}
我们思考一下这样子写结果是多少??我们可以用上面输出**ppa验证一下结果是多少
结果是4,验证正确,可是满足题意ppa指向pb吗?我们画图来看一下。
这个做的是让pa指向了b。所以得把ppa的值打印出来,才可以判断。是否使ppa指向了pb。这样子验证不是很严谨。
总结方法
预防多级指针解引用与使用错误严格按照几级指针几个p来定义指针,一个抵消一个p。所以pppa = *ppb 所以 ppa就指向了pb
举个栗子:
(**pp)pa = (*p)pb;//()里面是抵消的
那么就是pa = pb,pa指向了b。
这样子就更加简单的清楚地了解多级指针了呢 ^ _ ^