基础:C函数参数传递

要想了解参数传递,首先得了解参数变量,参数变量常见的表示实现有int & x、int* x、int x、int** x等。

1、int& x表示:int&表示引用类型,x表示引用变量名,引用类型不会开辟新的地址空间,只是传递参数的别名。

2、int*  x表示:  int*表示整数指针类型,x表示指针变量名,指针类型会开辟新的地址空间,x存储新开辟的地址空间,*x表示新开辟的地址空间存储的值。

3、int x表示:int表示整数类型,x表示整型变量名,整数类型会开辟新的地址空间,x存储整数值,&x表示存储整数值的地址空间。

4、int ** x表示:int**表示整数二级指针,x表示指针表量名。指针类型会开辟新的地址空间,x存储一级指针的地址空间,*x表示一级指针,存储二级指针的地址空间,

**x表示二级指针,存储整数值。

参数传递包括地址传递和值传递,地址传递又包括引用传递和指针传递。通过下面的例子来看看他们的区别:

void funy(int& x)
{
    std::cout<<"     funy1=地址:"<<&x<<";地址存的值:"<<x<<std::endl;
    x = 3;
    std::cout<<"     funy2=地址:"<<&x<<";地址存的值:"<<x<<std::endl;
    int *y = &x;
    *y = 8;
    std::cout<<"     funy3=地址:"<<y<<";地址存的值:"<<*y<<std::endl;
}

void funp (int* x)
{
    std::cout<<"     funp1=地址:"<<x<<";地址存的值:"<<*x<<std::endl;
    *x = 3;
    std::cout<<"     funp2=地址:"<<x<<";地址存的值:"<<*x<<std::endl;
    std::cout<<"     funp3=地址:"<<&x<<";地址存的值:"<<x<<std::endl;
}

void funv (int x)
{
    std::cout<<"     funv1=地址:"<<&x<<";地址存的值:"<<x<<std::endl;
    x = 8;
    std::cout<<"     funv2=地址:"<<&x<<";地址存的值:"<<x<<std::endl;
}

int main(int argc, char** argv)
{
    // 引用传递
    int x1 = 1;
    std::cout<<"\nfuny=地址:"<<&x1<<";地址存的值:"<<x1<<std::endl;
    funy(x1);
    std::cout<<"funy=地址:"<<&x1<<";地址存的值:"<<x1<<std::endl;
    // 指针传递
    int x2 = 2;
    std::cout<<"\nfunp=地址:"<<&x2<<";地址存的值:"<<x2<<std::endl;
    funp(&x2);
    std::cout<<"funp=地址:"<<&x2<<";地址存的值:"<<x2<<std::endl;
    // 值传递
    int x3 = 3;
    std::cout<<"\nfunv=地址:"<<&x3<<";地址存的值:"<<x3<<std::endl;
    funv(x3);
    std::cout<<"funv=地址:"<<&x3<<";地址存的值:"<<x3<<std::endl;
} 

运行结果:
funy=地址:0x7fff5fbfe5ac;地址存的值:1
     funy1=地址:0x7fff5fbfe5ac;地址存的值:1
     funy2=地址:0x7fff5fbfe5ac;地址存的值:3
     funy3=地址:0x7fff5fbfe5ac;地址存的值:8
funy=地址:0x7fff5fbfe5ac;地址存的值:8

funp=地址:0x7fff5fbfe5a8;地址存的值:2
     funp1=地址:0x7fff5fbfe5a8;地址存的值:2
     funp2=地址:0x7fff5fbfe5a8;地址存的值:3
     funp3=地址:0x7fff5fbfdab8;地址存的值:0x7fff5fbfe5a8
funp=地址:0x7fff5fbfe5a8;地址存的值:3

funv=地址:0x7fff5fbfe5a4;地址存的值:3
     funv1=地址:0x7fff5fbfdacc;地址存的值:3
     funv2=地址:0x7fff5fbfdacc;地址存的值:8
funv=地址:0x7fff5fbfe5a4;地址存的值:3 

通过结果,我们可以看到:

1、*加变量,此变量必须存储的是地址,则得到此地址存储的值;

2、&加变量,则得到存放此变量的地址。

3、变量x1和函数funy里参数x是同一个地址,因此改变x的值,x1的值也发生变化。参数x,前面的int&类型,表明x是一个引用类型,不会开辟新地址空间,只是变量x1的别名,就是说x和x1是同一个变量。这就是引用传递。 

4、变量x2和和函数funp里参数x不是同一个地址,x2的地址是0x7fff5fbfe5a8,x的地址是0x7fff5fbfdab8,变量x存储的值是x2的地址,可通过*x去改变变量x2地址存储的值。x2和x是两个不同变量。这就是指针传递。
5、变量x3和函数funv里参数x不是同一个地址,参数传递时,只是将变量x3存储的值赋值给变量x,通过变量x,无法得到变量x3的地址,也就无法改变变量x3的值。x3和x是两个不同变量。这就是值传递。
6、可以看到引用传递和指针传递,有些类似的作用;但它们各有优点,引用传递不会生成新的变量,节省空间,但是不能传NULL,而指针传递会产生新的变量,但可以传NULL。

时间: 2024-10-02 16:50:13

基础:C函数参数传递的相关文章

Python基础07 函数

原文:Python基础07 函数 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句.   函数的定义 首先,我们要定义一个函数, 以说明这个函数的功能. def square_sum(a,b): c = a**2 + b**2 return c 这个函数的功能是求两个数的

c++-关于C++中文件输入输出流作为函数参数传递的问题

问题描述 关于C++中文件输入输出流作为函数参数传递的问题 今天学习C++输入输出流的时候,遇到一个问题,先贴代码: void foutput (ofstream &fout, int m) { for (int i=1;i<=m;i++) { fout << i*i+0.5; } } 上面这个函数的参数中用了一个ofstream类的变量,在下面使用的时候就发现不能直接把ofstream类的实体用到函数中,编译会出错.然后,我把"ofstream fout"变

函数参数传递和动态内存分配的问题

问题描述 函数参数传递和动态内存分配的问题 利用下面这段代码进行动态内存分配有什么问题: char *getmemory(int sum) { char *p=NULL; p=(char *)malloc(sum); return p; } int main() { char *str=NULL; str=getmemory(100); strcpy(str,"hello c!"); printf("%sn",str); } 解决方案 你的主程序需要释放内存,否则可

C++函数参数传递三种方式

       当进行函数调用的时候,要填入与函数形式参数个数相同的实际参数,在程序运行的过程中,实参会将参数值传递给形参,C++函数参数传递有以下三种方式. 一. 值传递 1. 利用值传递方式,实际上是把实参的内容复制到形参中,实参和形参是存放在两个不同的内存空间中.在函数体内对形参的一切修改对实参都没有影响 2. 如果形参是类的对象,利用值传递的话每次都要调用类的构造函数构造对象,效率比较低 3. 看下面这个例子 #include<iostream> #include<algorith

lua 函数参数传递问题

问题描述 lua 函数参数传递问题 function test(t) t1 = t table.insert(t1,10) end t = {1,2,3,4} test(t) for k, v in pairs(t) do print (v) end 为何t插入了10? 解决方案 lua中通过值比较Boolean,String,Number类型的值,而通过引用比较Table,function,userdate类型的值. ?????????????? a = {}; a.x = 1; a.y =

浅谈JavaScript 函数参数传递到底是值传递还是引用传递_javascript技巧

在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是值传递和引用传递都具备.那么JS的参数传递到底是怎么回事呢?事实上以下的演示也完全可以用于Java 首先来一个比较简单的,基本类型的传递: function add(num){ num+=10; return num; } num=10; alert(add(num)); aelrt(num); //输出20,10 对于这里的输出20,10,按照JS的官方解释就是在基本类型参数传递的时候,做了一件复制

javascript自定义函数参数传递为字符串格式_javascript技巧

自定义函数参数传递为 字符串格式 ,传递方式 1:用this传递 2:引号缺省 3:转义字符(html中 " 代表"双引号,'代表单引号,javascript中直接\" 和Java通用转义字符集) <html> <head> <script language="LiveScript"> function print(arg){ alert("你好!"+arg); } </script> &

C++第17周项目1——体会函数参数传递

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目1-体会函数参数传递]1.下面三段程序都试图通过定义函数,实现实际参数在必要时的交换,哪些能够实现,哪些不能实现?通过运行程序和单步执行,让自己对这一过程更加清楚,然后请在博文中给出明确的回答,并用你自己的话展开描述(自己的话,但要用术语,用术语讲技术的事,是必须经历的一个过程.) 2.设计一个程序,输入3个整数,将其按从大到小的顺序输出,要求(1)排序功能通过函数

AngularJS中一般函数参数传递用法分析_AngularJS

本文实例讲述了AngularJS中一般函数参数传递用法.分享给大家供大家参考,具体如下: 1. 模型参数 直接使用变量名,不要加引号 <!doctype html> <html ng-app="passAter"> <head> <meta charset="utf-8"/> </head> <body> <div ng-controller="passCtrl">