指针与函数

来源:互联网 发布:淘宝店铺分类在哪里 编辑:程序博客网 时间:2024/05/17 06:46

昨晚睡前突发奇想,就拿了指和笔,画了一堆乱七八糟的格子,

画风大致如下


以上图是如下代码的内存模拟图

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中的值,则是一样的,对一级指针再次解引用,

再交换它的值.


到此,函数运行完毕.