定义:
传出参数应该是C语言里面特有的,我参考了一下网上的博客,缺乏权威的定义。如果有,麻烦大家告诉我。
下面是我参考了C++ Primer 的总结:
传出参数指的是函数的形参是指针,由于形参是实参的拷贝,二者的值一样,也就是指向的地址空间一样,在函数中通过这个指针对形参所指向的数据进行修改能够反映到实参上,就好像函数能够产生返回值一样。
如下图:p1,p2均为指针,一个是形参一个是实参。通过p1对p1所指向的数据的修改反映到p2上。
与C++中引用的区别
一开始进行C语言编程的时候对传出参数感觉有一些疑惑,感觉作用和C++的引用很像,但是C语言里面没有引用,而C++因为有了引用所以传出参数使用不是很多。
C++函数传参类型:
对于函数传参,有两种类型:值传递和引用传递。对于引用传递,引用形参是对应实参的别名,形参和实参指向的是同一个对象。(这里的对象可以理解为变量),如果采用值传递,形参和实参实际上是两个独立的对象,只不过实参的值被拷贝给了形参。
当指针作为参数的时候也是一样的,作为形参和实参的指针是两个不同的对象,但是与一般对象不同的是,他们的值是相同的,因此能够产生类似于C++里面“ 引用 ”的效果,也就是对形参所指向的数据进行修改,由于形参和实参指向的都是同一个内存地址,实参所指向的数据也会同样发生修改
其他的博客里面提到的C++里面的传出参数我觉得不是很准确,这是C里面的用法,只不过C++能够兼容C,所以这种传出参数也适合于C++,但是C++ Primer里面明确说了,在C++里面应该用引用代替这种作法(see C++ Primer 5th edition 中文版 P188)。
实例
C语言的传出参数,输出结果是
a value: 3
b value: 5
#include <stdio.h>
void func1(int* a) {
*a += 1;
}
void func2(int* b) {
*b += 1;
}
void func(int* a, int* b) {
func1(a);
func2(b);
printf("a value: %d\n", *a);
printf("b value: %d\n", *b);
}
int main() {
int v_a = 2;
int v_b = 4;
int* a = &v_a;
int* b = &v_b;
func(a, b);
}
C++中的引用
输出结果是
a value: 3
b value: 5
#include <stdio.h>
void func1(int& a) {
a += 1;
}
void func2(int& b) {
b += 1;
}
void func(int &v_a, int &v_b) {
func1(v_a);
func2(v_b);
printf("a value: %d\n", v_a);
printf("b value: %d\n", v_b);
}
int main() {
int v_a = 2;
int v_b = 4;
// int* a = &v_a;
// int* b = &v_b;
func(v_a, v_b);
}