一、C语言函数的值传递
C语言的值传递,顾名思义就是使用常量、数组等作为函数的参数,定义一个函数后,其在被主函数调用的过程中,实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元。
值传递的特点:
值传递的最大的特点就是单向传递,即主调函数被调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。 如下代码所示,定义了一个函数swap()用于交换两个参数的值,在被主函数调用的过程中,a和b的值相当于被拷贝了一份过去swap函数,无论在swap()函数中完成了什么操作,都是不会影响到主函数中定义的两个变量a、b存储的值的。
#incldue <stdio.h>
void swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
int main(int argc, char *argv[])
{
int a = 12,b = 24;
swap(a,b);
printf("a = %d b = %d",a,b);
return 0;
}
程序运行后的结果如下:
C:\Users\11197\Desktop\main>swap
a = 12 b = 24
二、C语言函数的地址传递
大家呢都知道,在C语言中,数组名就代表着数组存储空间的首地址,所谓的地址传递,就是函数的参数是数组名或者指针,传递的是数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,即形参和实参是相同的。
地址传递的特点:
形参并不存在存储空间,编译系统不为形参数组分配内存。因此在数组名或指针作函数参数时所进行的传送只是地址传送,形参在取得该地址之后,与实参共同拥有一段内存空间,形参的变化也就是实参的变化。
实例代码如下,函数swap()传入的是两个地址,在主函数调用的过程中,将变量a、b的地址传入了swap()函数中,在swap()函数中,通过指针解引用等操作完成了两个地址的存储值的值交换。
#include <stdio.h>
void swap(int* x,int* y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int main(int argc, char *argv[])
{
int a = 12,b = 24;
swap(&a,&b);
printf("a = %d b = %d\n",a,b);
return 0;
}
函数运行结果如下:
C:\Users\11197\Desktop\main>dizhi
a = 24 b = 12
可以看到,通过地址传递的方式,成功的交换了变量a、b中存储的值。
三、局部变量作为函数返回值
局部变量是不会进行存储的?所以函数void *fun(void)调用结束的时候,buf[]被释放了,没法返回一个地址。
#include <stdio.h>
char *fun(void)
{
char buf[] = "helo world!";
return buf;
}
int main()
{
char *p;
p=fun();
printf("the p is %s\n",p);
return 0;
}
可以看到程序运行的结果如下:
C:\Users\11197\Desktop\main>jububianliang
the p is Pi
接下来在函数中的bud前面加上static看看效果,加上这个值相当于将buf[]存储在不易被改变的静态区
#include <stdio.h>
char *fun(void)
{
static char buf[] = "helo world!";
return buf;
}
int main()
{
char *p;
p=fun();
printf("the p is %s\n",p);
return 0;
}
我们来看运行输出的效果:
C:\Users\11197\Desktop\main>jububianliang
the p is helo world!
将函数void *fun(void)改变为只单单返回一个“hello world!”也可以看到相同的效果:
#include <stdio.h>
char *fun(void)
{
return "hello world!";
}
int main()
{
char *p;
p=fun();
printf("the p is %s\n",p);
return 0;
}
运行效果如下:
C:\Users\11197\Desktop\main>jububianliang
the p is helo world!
|