C语言中的参数传递机制详解

2020-01-06 17:11:25王旭

编译后运行,输出如下:


结构体参数传递示例:
实参date的地址:0x5fcb00
实参date的值:2017-4-2
形参date的地址:0x5fcae0
形参date的值:2018-12-31
函数调用后,实参date的值:2017-4-2
共用体参数传递示例:
实参data的地址:0x5fcaf0
实参data的值,d.i:2017, d.f:0.000000, d.d:0.000000
形参data的地址:0x5fcab0
形参data的值,d.i:2017, d.f:0.000000, d.d:0.000000
函数调用后,形参data的值,d.i:-1717986918, d.f:-0.000000, d.d:2017.400000
函数调用后,实参data的值,d.i:2017, d.f:0.000000, d.d:0.000000
 

我们发现,C中的自定义类型作为参数传递时,和基本类型一样,也是按值传递。

小结

C语言中,参数类型为字符型、整型、浮点型以及枚举型、结构体(struct)和共同体(union)时,都是常规的值传递。而指针作为一种特殊的类型,其值为一个地址,所指向的基类型可以任意其他类型(包括void)甚至可以指向函数,所以,指针作为参数时虽然本质上属于值传递,但因为传递的是一个地址,可以让被调函数通过对指针所指内容的操作直接作用于外部数据,属于参数传递中特殊的值传递方式。虽然可以把形参声明为数组,但实际的形参却是指针,因此,数组作为参数的传递方式也是特殊的值传递。

我们通过依次考察C语言中各种数据类型发现: C语言中只有值传递!


注:相关教程知识阅读请移步到C++教程频道。