现在的位置: 首页 > 综合 > 正文

C语言中函数参数传递的思考

2012年01月04日 ⁄ 综合 ⁄ 共 1029字 ⁄ 字号 评论关闭

C语言中,可以保证:

1. 所有函数都使用值传递:其实即使是指针,也是值传递。C++中引用传递归结到最后仍然是值传递

2. 实参到形参的参数传递过程其实是形参的初始化(!=赋值)过程。传递参数时做一些运算表达式,直接按赋值初始化理解

3. 形参的作用域是函数域,它和函数内定义的其他自动变量一样,并没有任何特殊性。

4. 函数形式参数带const限定符时,实参是可以成功传递的,这次传递相当于初始化。一旦初始化后,即不允许改变

5. 参数传递的顺序是从右到左。

例子一:(规则2)

#include <stdio.h>
 
void func(int ii)
{
    printf("In func():%d\n", ii);
}
 
int main()
{
    int i=0;
    func(i++);
 
    printf("Out func():%d\n", i);
 
    return 0;
}

结果:

In func():0
Out func():1

可见将实参i传入到函数形参时,即是赋值的过程。

ii = i++;

例子二:三段小程序(规则4)

#include <stdio.h>
 
int main()
{
    int i=0;
    const int j=i;
 
    return 0;
}

此程序不会有任何问题。

#include <stdio.h>
 
int main()
{
    int i=0;
    const int j;
    j=i;
 
    return 0;
}

这段程序会有编译错误!所以你必须分清初始化赋值的关系

#include <stdio.h>
 
void func(const int ii)
{
    printf("In func(): %d\n", ii);
}
 
int main()
{
    int i=0;
 
    func(i);
 
    return 0;
}

这个程序却无任何错误。

例子三:(规则5)

#include <stdio.h>
 
void func(int i, int j)
{
    printf("In func(): i=%d\n", i);
    printf("In func(): j=%d\n", j);
}
 
int main()
{
    int i=0;
 
    func(i, i++);
 
    return 0;
}

结果:

In func(): i=1
In func(): j=0

#include <stdio.h>
 
void func(int i, int j)
{
    printf("In func(): i=%d\n", i);
    printf("In func(): j=%d\n", j);
}
 
int main()
{
    int i=0;
 
    func(i, ++i);
 
    return 0;
}

结果:

In func(): i=1
In func(): j=1

抱歉!评论已关闭.