函数参数的传递

梦里伊人 posted @ 2008年12月26日 04:41 in c语言笔记 , 2109 阅读

         函数参数的传递

#include <stdio.h>

/*   情况一   */
//void test(int k)
//{
//      int a = 0;
//      a = k + 2;
//      k = a;
//      printf("a=%d\n", a);
//      printf("k=%d\n", k);
//}
//
//int main()
//{
//      int i = 0;
//      test(i);
//      printf("i=%d\n", i);
//}


/*   情况二   */
//void test(int *k)
//{
//      int a = 0;
//      a = *k + 2;
//      *k = a;
//      printf("a=%d\n", a);
//      printf("k=%d\n", *k);
//}
//
//int main()
//{
//      int i = 0;
//      test(&i);
//      printf("i=%d\n", i);
//}


/*   情况三   */
void test(int *k)
{
        int a = 0;
        a = *k + 2;
        k = &a;
        printf("a=%d\n", a);
        printf("k=%d\n", *k);
}

int main()
{
        int i = 0;
        test(&i);
        printf("i=%d\n", i);
}

三种情况的输出结果分别为:

第一种情况:
a=2
k=2
i=0
第二种情况:
a=2
k=2
i=2
第三种情况:
a=2
k=2
i=0

    分析以上三种情况,可以发现,要想通过子函数改变主函数中的某个变量,传递的参数必须是指针变量,并且在子函数中必须是对该变量地址中的内容进行相应改变。

Avatar_small
LiYanrui 说:
2008年12月26日 09:47

函数参数的传递主要分为“传值”和“传引用”。

所谓传值,就是在调用函数时,将实参复制一份并将其作为函数的形参。函数内部对形参的任何修改,都与实参无涉。换句话说,函数的实参和形参不是一个东西。

所谓传引用,就是在调用函数时,将实参直接作为函数的形参,函数内部对形参的修改直接反映到实参上。换句话说,函数的实参和形参都是同一个东西。

C 语言函数的参数传递方式只有传值这一种,但是它可以通过指针来模拟传引用。

Avatar_small
LiYanrui 说:
2008年12月26日 10:14

每个 C 函数都有自己的栈空间(很有限的内存空间),在 linux 下可以通过 "ulimit -s" 命令查看其默认大小。

C 函数在接受参数时,总是将实参的值压入这个栈空间里。即使你传入的是指针,也是将指针的值压入这个栈中。这样,你在函数中对所传入的任何参数本身的修改,只是修改了栈空间中的数据而已,函数之外的内存空间不会有什么变化。由于函数的栈空间的大小默认是有限的,因此记住不要向函数传递占用内存较大的变量(比如一个巨大的结构体)。

指针作为参数,在 32 位机器中,仅仅是一个整型数而已,但是这个整型数所标号的内存空间位于函数的栈空间之外,在函数内部可以通过指针的值去找到那块内存空间的起始地址,并根据指针的类型确定该内存空间的大小。

这些知识,其实在一些经典的 C 语言书中都有讲。多看书,勤尝试,远胜埋头瞎琢磨。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter