C语言中, 参数传递只有“传值”一种方式。
通常通过值传递的实际参数, 只能用作函数的输入参数。
如果需要函数输出一个参数, 唯一的办法就是传递一个“指针值” —— 依然是传值——该值保存了另一个对象(变量?)的地址。
然后通过指针(保存的地址)去修改那个对象, 达到“输出”的目的。
举例: 一个老掉牙的例子 ……
void swap(int p1 /*input*/, int p2 /*input*/) {
int t = p1;
p1 = p2;
p2 = p1;
}
void f() {
int a1 = 1212, a2 = 326;
swap(a1, a2);
assert( a1 == 1212 && a2 == 326);
/* 不会因为plus中对形式参数的修改,导致实际参数的变化
它们依然是原来的值
*/
}
如果想要函数修改实际参数, 在C语言中, 唯一的办法就是传递指针。
同时, 该修改也是间接的 —— 并不能修改实际参数本身, 只能修改实际参数指向的对象。
例如 :
void swap(int* p1, int* p2 ) {
int t = *p1; // 取p1指向对象的值。
*p1 = *p2; // 将p2指向对象的值,赋值给p1值向的对象。
*p2 = t; // 将t赋值给p2指向的对象。
p1 = 0; // p1 和p2 仍然是通过“值”传递
p2 = 0; // 修改p1 p2不会对实际参数产生任何作用。
}
void f() {
int a1 = 1212, a2 = 326;
int* pa1 = &a1, *pa2 = &a2;
swap(pa1, pa2); // swap(&a1, &a2);
assert( a1 == 326 );
assert( a2 == 1212 );
// a1 与 a2, 通过函数调用, 确实被修改了。
assert( pa1!=0 );
assert( pa2!=0 );
// 但是这2个通过“值”传递的指针, 依然不会被修改。
}
所以, 如果你打算“输出” 一个 FILE* 就需要传递一个 FILE**。
int my_open(FILE** file, const char* name, const char* mode) {
FILE* fp = fopen(name,mode);
if (!fp)
return error;
*file = fp; // 通过指针, 修改一个 FILE* 对象的值。
return ok;
}
void f() {
FILE* fp = 0;
int r = my_open(&fp // 传入地址
,"cherrie.own", "r");
if (r == ok ) { assert(fp!=0); }
else { assert(fp==0); }
}
阅读(646) | 评论(1) | 转发(0) |