Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25612
  • 博文数量: 9
  • 博客积分: 148
  • 博客等级: 入伍新兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-06 00:17
个人简介

xxx

文章分类

全部博文(9)

文章存档

2016年(1)

2015年(2)

2014年(1)

2012年(2)

2011年(2)

2010年(1)

分类:

2010-04-09 10:41:25

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) |
0

上一篇:没有了

下一篇:判断文件mode_t相关参数

给主人留下些什么吧!~~

senfar2010-04-09 11:38:55

优化一下,可否这样
bool TProFile::openFile(FILE **pf,const char *fileName,const char *mode)
{
    if (*pf != NULL) {
        fclose(*pf);
        *pf = NULL;
    }
    *pf = fopen(fileName,mode);
    if (pf == NULL) {
        throw TException("Open file[%s] Error:%s", fileName, strerror(errno));
&n