首页 理论教育C语言中指针和数组名作为函数参数的实用技巧

C语言中指针和数组名作为函数参数的实用技巧

【摘要】:指针及数组名作为函数的参数时,是以数据的地址作为实参调用该函数,即作为参数传递的不是数据本身,而是数据对应的地址,使实参和形参指向同一存储单元。所以,调用函数与被调函数存取的将是相同的一组空间,即双向的“地址”传递,也就是说函数调用后,实参指向的对象的值可能会发生变化。图6.15程序运行结果从程序运行结果可以明显地看出,只有swap3 函数能实现交换两个整数的目的。

指针及数组名作为函数的参数时,是以数据的地址作为实参调用该函数,即作为参数传递的不是数据本身,而是数据对应的地址,使实参和形参指向同一存储单元。所以,调用函数与被调函数存取的将是相同的一组空间,即双向的“地址”传递,也就是说函数调用后,实参指向的对象的值可能会发生变化。

如果修改指针所指向的目标,能使函数带回多个值,而修改指针本身,不能使函数带回多个值。下面以交换两个整数为例进行说明。

【例6.11】交换两个整数——指针与函数。

程序运行结果如图6.15 所示。

图6.15 程序运行结果

从程序运行结果可以明显地看出,只有swap3 函数能实现交换两个整数的目的。下面结合swap 函数,采用图示法进一步说明传值和传址这一重要的基本概念。

传值是单向传递,即将实参的值传递给对应的形参,而不可能将形参的值反传递给实参。传递结束,实参和形参不存在任何联系,因此,形参值的修改不会影响实参值,如图6.16 所示。形象地显示出:形参x、y 的值进行了交换。但是,由于形参x、y 的值不能修改实参x、y 的值,所以实参x、y 的值保持原值。

图6.16 传值

(www.chuimin.cn)

传址(传地址值)是将实参的地址传递给对应的形参,实现了形参共享实参,即形参x、y 指针所指向的目标就是实参x、y 存储单元。图6.17 显示出了形参共享实参概念。同时也显示出:形参x、y 的指针值进行了交换,即x 指针改为指向实参y,而y 指针改为指向实参x。但是,实参x、y 值没有被修改,仍保持原值。

图6.17 传址,修改指针

传址(传地址值),实现了形参共享实参。在swap3 函数中的下列语句:

是交换x、y 指针所指向的目标,即交换实参x、y 的值,且向调用函数传回两个值,如图6.18所示。

图6.18 传址,修改目标

从swap3(传址,修改目标)函数可以看出:通过指针类型形参,且修改它所指向的目标,可以使函数带回多个值。数组名是常量地址。因此,一维数组名和指针可相互传递(要注意,类型必须相同),如图6.19 所示。但是,二维数组名和指针不可相互传递。

图6.19 实参、形参