指针与参数传递
摘要 指针是c语言的精髓之一,也是学习的难点;函数参数是传递信息的重要接口。本文从指针作函数参数的角度,来阐明参数传递的方式和指针的本质,c语言的学习和应用提供参考。
关键词 c语言;指针;参数
中图分类号 tp39 文献标识码 a文章编号 1674-6708(2010)18-0134-01
c语言规定所有参数均以“传值”的方式进行传递,被调函数获得的仅是实际参数的拷贝(这个拷贝值赋给形式参数)。因为这个特性,函数可以放心使用这个拷贝值,而不必担心修改了实际参数的值。
molloc函数如果我们需要通过函数调用来改变程序中某些变量(本文只涉及自动型变量)的值,通常有2个方法:一是将函数的返回值赋给该变量;二是利用函数参数,用该变量的地址(即指针)作为实际参数,通过指针来间接访问该变量。本文讨论的是第二种方法。
程序12是在很多c教材中会见到的经典的例子,程序试图交换ab两个变量的值。
程序1中的swap1函数并不能交换实际参数ab的值。函数调用仅仅将ab的值传递给了形式参数xy。形参与实参占用的是不同的内存空间,swap1只是交换了形式参数xy的值,ab没有任何影响。
程序2,函数swap2的两个形参是整型指针,函数调用时实际参数为ab的地址,这两个地址将拷贝给形参xy,这意味着xy是分别指向变量ab的指针, *x*y的引用就是对ab的引用,因此,函数swap2能成功交换主调函数中变量ab的值。
很多初学者认为只要将参数改为指针就可以解决一切类似问题,其实不然。注意下面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)会导致程序异常。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。