昨晚睡前突发奇想,就拿了指和笔,画了一堆乱七八糟的格子,
画风大致如下
以上图是如下代码的内存模拟图
void change(int **a, int **b);
int main()
{
int a = 1;
int b = 2;
int *pta = &a;
int **ptaa = &pta;
int *ptb = &b;
int **ptbb = &ptb;
printf("address a:%p address b:%p\n",&a,&b);
change(ptaa,ptbb);
printf("address pta:%p address ptb:%p\n",pta,ptb);
printf("value a:%d value b:%d\n",a,b);
return 0;
}
void change(int **a, int **b)
{
int temp1;
int *temp = *a;
*a = *b;
*b = temp;
temp1 = **a;
**a = **b;
**b = temp1;
}
如上所示,代码的意图是使用change函数把主函数中的a,b值对换,
在非主函数中,如果不使用指针,是无法对主函数变量进行改变的,
其实这个问题用一级指针解决很快很简单就可以解决
为了加深对指针的理解,所以写了一个二级指针.
通过内存模拟图和代码,可以看出,指针变量pta存储的是变量a的地址,
指针变量ptb存储的是变量b的地址,指向指针的指针变量ptaa存储的是指针变量pta,
指向指针的指针变量ptbb存储的是指针变量ptb的地址.
好了下面来分析一下如何把主函数中a,b的值互换.
首先,我们需要给change函数传过去两个二级指针的值.
在change函数中,我们创建了一个两个临时变量,一个临时指针变量temp,一个临时变量temp1;
分别用于更改两个一级指针中的地址和更改地址对应的值.
下面是图解分析
change函数中首次更改的是pta和ptb中存储的地址,
对二级指针解引用,得到了pta和ptb中存储的地址,然后交换.
交换后的内存模拟图如下
然后,现在要改a,b中的值,则是一样的,对一级指针再次解引用,
再交换它的值.
到此,函数运行完毕.