指针与参数传递

时间:2022-09-27 01:19:49

摘要 指针是C语言的精髓之一,也是学习的难点;函数参数是传递信息的重要接口。本文从指针作函数参数的角度,来阐明参数传递的方式和指针的本质,为C语言的学习和应用提供参考。

关键词 C语言;指针;参数

中图分类号 TP39 文献标识码 A文章编号 1674-6708(2010)18-0134-01

C语言规定所有参数均以“传值”的方式进行传递,被调函数获得的仅是实际参数的拷贝(这个拷贝值赋给形式参数)。因为这个特性,函数可以放心使用这个拷贝值,而不必担心修改了实际参数的值。

如果我们需要通过函数调用来改变程序中某些变量(本文只涉及自动型变量)的值,通常有2个方法:一是将函数的返回值赋给该变量;二是利用函数参数,用该变量的地址(即指针)作为实际参数,通过指针来间接访问该变量。本文讨论的是第二种方法。

程序1、2是在很多C教材中会见到的经典的例子,程序试图交换a、b两个变量的值。

程序1中的swap1函数并不能交换实际参数a、b的值。函数调用仅仅将a、b的值传递给了形式参数x、y。形参与实参占用的是不同的内存空间,swap1只是交换了形式参数x、y的值,对a、b没有任何影响。

程序2中,函数swap2的两个形参是整型指针,函数调用时实际参数为a、b的地址,这两个地址将拷贝给形参x、y,这意味着x、y是分别指向变量a、b的指针,对 *x、*y的引用就是对a、b的引用,因此,函数swap2能成功交换主调函数中变量a、b的值。

很多初学者认为只要将参数改为指针就可以解决一切类似问题,其实不然。注意下面2个程序区别:

程序的意图是:在主函数中定义整型指针mp,通过调用fun函数使mp指向malloc函数申请的能存储一个整型数据的空间,最后利用mp间接访问该空间,将整型数据1存入。

程序3是错误的,如图1所示,mp和形式参数fp都是指针变量,会分配到内存空间,mp定义了却没有初始化,它的存储内容是随机的(图中用“?”表示),调用fun函数仅仅将mp的值(即这个随机值)赋给fp,但fp的值立刻被malloc函数修改为208(假设malloc函数申请空间成功且对应内存首地址为208)。可见fun函数并未对mp产生影响,mp仍然是随机值,它指向的是一块未知空间或者非法地址。若将程序在windows环境下的PC上运行,通过指针mp对未知空间的间接访问操作(语句“*mp=1”)会导致程序异常。

程序4则能成功达到目的。注意,fun函数的形参fp不再是指向整型数据的指针而是指向整型指针的指针,实际参数则是mp的内存地址。从main函数第一句开始分析,如图2所示,mp被定义,为它分配空间(假设这个空间地址是100),因未被初始化,这个空间的里的内容是随机的;接着,调用fun函数,fp分配到空间,生命期开始,通过参数值传递它的值为mp的地址100,fp就是指向mp的指针。fun函数调用后的结果如图3所示,malloc函数申请到的空间地址(假设为208)被赋给了*fp,即赋给了mp,mp的值变为208,此时mp就指向了能存储一个整型数据的空间。接下来的语句“*mp=1”则将整型数据1存入这个空间,如图4所示。

指针也是变量,会分配空间,只是空间里存储的内容是地址罢了(所以有“指针即地址”的说法);用指针作参数同样采用“值传递”形式,只不过传递的值是地址而已,形参并不与实参共享空间。C程序员经常通过指针来间接访问它所指向的地址空间,这能增强程序的高效灵活性。

参考文献

[1] Kenneth A. Reek. Pointers on C. 徐波译.C和指针.北京:人民邮电出版社,2008.

[2] 谭浩强.C程序设计.第3版.北京:清华大学出版社, 2005.

[3] 王功明,黄婧.二级C语言.北京:电子工业出版社, 2008.

上一篇:充电器外壳注射模塑件结构工艺性分析及设计计... 下一篇:商品住宅建筑设计几点思考