指针参数传递实质及二级指针使用

匿名 (未验证) 提交于 2019-12-03 00:18:01

水平有限,如有错误,欢迎指正,谢谢。

先看两个程序

耐心仔细看,应该能理解。

1

void test(char *p)

{

}

int main()

{

}

输出结果:注意:(test函数的pde值已改变,main函数的a的值未改变)

main1][a]:0xbfeaaef6.
[main2][a]:abcde.
[test1][p]:0xbfeaaef6.
[test2][p]:abcde.
[test3]malloc之后…..
[test4][p]:0x8a52008.
[test5][p]:ABCDE.
[main3][a]:0xbfeaaef6.

2

void test(char **p)

{

}

int main()

{

}

输出结果:注意:(test函数的pde值已改变,main函数的a的值也已经改变)

[main1][a]:0xbfaca776.
[main2][a]:abcde.
[test1][p]:0xbfaca770.
[test2][*p]:0xbfaca776.
[test3]malloc之后…..
[test4][p]:0xbfaca770.
[test5][*p]:0x9132008.
[test6][*p]:ABCDE.
[main3][a]:0x9132008.

问题:

1、形参和实参的概念?

2、参数传递的实质?

3、指针是什么?为什么要用指向指针的指针?

4、位什么第一个程序不能改变a的值,而第二个程序却可以?

先解释一下形参和实参的概念:

实参:实实在在的参数,我们自己定义的,比如以上程序中指针a和数组b都是实参,都是自己定义的,基本程序中花括号内定义的所有参数都是实参

形参:我们定义一个函数时,括号内的参数,比如以上程序中的char *p和char **p中的p就是形参,主要是为了让实参的数据可以传递到函数内,供函数操作

2个问题:

3个问题:


好了,回到第4个问题,程序本身,为什么会出现这种现象?

第一个程序:

我们先看看调用test函数前后,以及malloc之前和malloc之后的指针p的和指针a的地址以及指向情况:

之前的指向情况:(方块上面是当前变量的地址,方块内是当前变量的值)


从之前的情况可以看出,函数进行参数传递时,实参把地址传给了形参p(p即是a的副本(_a),p=_a是为了表达更直观,并不会产生变量名_a),两个指针同时指向一片内存;使用malloc之后,空出一遍新内存并把地址赋给p,即p的指向改变,指向了新地址;所以test内对p的内容进行改变不会改变a的值。

第二个程序:

同样先看看调用test函数前后,以及malloc之前和malloc之后的指针p的和指针a的地址以及指向情况:

之前的指向情况:

之后的情况:

        </div>             </div>         </article> 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!