C语言的3种参数传递方式

来源:互联网 发布:twrp备份文件提取数据 编辑:程序博客网 时间:2024/05/22 02:06

参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,方法有3种方式

  • 值传递
  • 地址传递
  • 引用传递

tips:

  1. 被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放
  2. 值传递和地址传递,传递的都是实参的一个拷贝
  3. C语言中实参和形参之间的数据传递是单向的“值传递”,单向传递,只能由实参传给形参,反之不行
  4. 输出格式并没有选择%p而是选择了%d,因为十进制的数看起来更直观

值传递

  • 如果只是传递值的话:
#include <stdio.h>    //值传递传值void swap( int x, int y);int main(){    int a=2,b=3;    printf("before:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);    swap(a,b);    printf("after:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);    return 0;}void swap(int x,int y){    int tmp;    tmp=x;    x=y;    y=tmp;    printf("inside:形参为x,y\nx=%d,地址为%d\ny=%d,地址为%d\n\n",x,&x,y,&y);}

执行结果:
值传递_值

  • 如果传递的是地址呢?
#include <stdio.h>    //值传递传地址void swap( int *x, int *y);int main(){    int a=2,b=3;    printf("before:实参为&a,&b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);    swap(&a,&b);    printf("after:实参为&a,&b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);    return 0;}void swap(int *x,int *y){    int *tmp= NULL;    tmp=x;    x=y;    y=tmp;        printf("inside:形参为*x,*y\n*x=%d,x=%d,地址为%d\n*y=%d,y=%d,地址为%d\n\n",*x,x,&x,*y,y,&y);}

执行结果:
值传递_地址

地址传递

#include <stdio.h>    //地址传递void swap( int *x, int *y);int main(){    int a=2,b=3;    printf("before:实参为&a,&b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);    swap(&a,&b);    printf("after:实参为&a,&b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);    return 0;}void swap(int *x,int *y){    int tmp;    tmp=*x;    *x=*y;    *y=tmp;        printf("inside:形参为*x,*y\n*x=%d,x=%d,地址为%d\n*y=%d,y=%d,地址为%d\n\n",*x,x,&x,*y,y,&y);}

执行结果为:
地址传递

引用传递

#include <stdio.h>    //引用传递void swap( int &x, int &y);int main(){    int a=2,b=3;    printf("before:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);    swap(a,b);    printf("after:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);    return 0;}void swap(int &x,int &y){    int tmp;    tmp=x;    x=y;    y=tmp;        printf("inside:形参为&x,&y\nx=%d,地址为%d\ny=%d,地址为%d\n\n",x,&x,y,&y);}

执行结果为:
引用传递

补充

int x=1;int *y=&x; //用于指针传递,y有自己独立的内存地址,存储的内容是x的地址,*y是x的值int &z=x; //用于引用传递,可以理解为z就是x,x就是z,只不过名字不一样
原创粉丝点击