函数参数的传递
梦里伊人
posted @ 2008年12月26日 04:41
in c语言笔记
, 2129 阅读
函数参数的传递
#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);
}
/* 情况一 */
//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
a=2
k=2
i=0
第二种情况:
a=2
k=2
i=2
第三种情况:
a=2
k=2
i=0
分析以上三种情况,可以发现,要想通过子函数改变主函数中的某个变量,传递的参数必须是指针变量,并且在子函数中必须是对该变量地址中的内容进行相应改变。
2008年12月26日 09:47
函数参数的传递主要分为“传值”和“传引用”。
所谓传值,就是在调用函数时,将实参复制一份并将其作为函数的形参。函数内部对形参的任何修改,都与实参无涉。换句话说,函数的实参和形参不是一个东西。
所谓传引用,就是在调用函数时,将实参直接作为函数的形参,函数内部对形参的修改直接反映到实参上。换句话说,函数的实参和形参都是同一个东西。
C 语言函数的参数传递方式只有传值这一种,但是它可以通过指针来模拟传引用。
2008年12月26日 10:14
每个 C 函数都有自己的栈空间(很有限的内存空间),在 linux 下可以通过 "ulimit -s" 命令查看其默认大小。
C 函数在接受参数时,总是将实参的值压入这个栈空间里。即使你传入的是指针,也是将指针的值压入这个栈中。这样,你在函数中对所传入的任何参数本身的修改,只是修改了栈空间中的数据而已,函数之外的内存空间不会有什么变化。由于函数的栈空间的大小默认是有限的,因此记住不要向函数传递占用内存较大的变量(比如一个巨大的结构体)。
指针作为参数,在 32 位机器中,仅仅是一个整型数而已,但是这个整型数所标号的内存空间位于函数的栈空间之外,在函数内部可以通过指针的值去找到那块内存空间的起始地址,并根据指针的类型确定该内存空间的大小。
这些知识,其实在一些经典的 C 语言书中都有讲。多看书,勤尝试,远胜埋头瞎琢磨。