函数参数传递出结果

最近总是在封装函数的时候,纠结如何往封装函数内带入有用的值,又如何从封装函数带出来必要的内容,在此,关于做了一些基础知识的整合。

1.变量将值带入函数的形参

  这种情况比较简单,就是将定义好的相应类型的值传递到自己封装的函数内就可以了,在此不必传入地址,或者应用之类的,直接传递真值即可,此处就不过多的进行归纳了。

2.用变量从函数形参带出必要的内容

  这也是一些基础知识了,但是在平常过程中用的比较多,所以我就自己为了方便,来记录一下自己是如何应用的。以前,我以为只要定义一个对应类型的变量,将它放在形参列表中,然后等到函数运行结束,直接取值用就可以了,但是想法是美好的,结果并不令人满意,如代码:

//声明部分
void applications(unsigned *uiInput, unsigned int ulOutput);

//应用部分
unsigned uiInit = 20;
unsigned uiResult = 0;
applications(&uiInit, uiResult);
printf("%d\n", uiResult);

其实这里返回出来的uiResult并不是你想要的值,具体暂时就先不讨论了,而正确的应该是怎样的呢,如下代码:

//声明部分void applications(unsigned *uiInput, unsigned int* ulOutput);
//应用部分
unsigned uiInit = 20;
unsigned uiResult = 0;
applications(&uiInit, &uiResult);
printf("%d\n", uiResult);

这里利用指针来给形参传递一个地址,这样做有什么好处呢,如下归纳:

SetUsername(String* username)接受一个指向String类的指针,在C中按指针传递往往是为了节约程序对系统资源的开销,让程序跑的更快,如果使用SetUsername(String username),那么SetUsername在接受该参数时会复制传入如象String 的一份拷贝,而如果String是一个很大的结构的话,这个复制的过程将会大大增加程序对内存及其他资源的开销,在C++中更好的方法是按引用传递,这样又节约了一个指针的开销。

传递原则:在C++中如果不对传入的对象做任何更改的话应该使用按const引用传递,如 void func(const int& a);

如果要做任何改动的话就使用按引用传递,如void func(int& a);

如果函数的返回值不能作为左值的话就应该返回一个const或者const 引用,如const int& func(const int& a){return a;}或者const int func(const int& a){int temp = a;return temp++;}这样就避免了func(a)=b的写法;

如果类的成员函数不对类的数据成员做任何更改的话就应该将函数声明为const函数如:const int& func(const int&a)const;

归纳:在C++中,函数参数的传递首先考虑按引用传递,其次是在任何你可以使用指针的地方尽量避免使用并思考用其他的方法替换,Koenig & Moo 夫妇在为想成为更好的 C++ 程序员的人提出的3条建议中第1条就是"避免使用指针",你相信吗?指针正是 C 的核心呀。C 的宏、位运算、结构、联合、数组、强制类型转换、指针,在 C++ 程序中都应该尽量避免(在少量涉及底层的程序设计中例外),C++ 语法上强调的是类、对象、模板、标准库、引用、异常和 const 关键字,思想上强调的是面向对象和泛型。

3.用结构体从函数形参带出必要的内容

  该种场景的是出现在,假如你从函数中要到处多于1个有用值的时候,假如你过多的使用形参列表,这样是你的代码看起来很臃肿,而且可读性也不是很好,这样就可以试试用结构体的形式来带出有必要的内容,代码如下:

//定义结构体部分
typedef struct {
    unsigned long ulOutputTemp1;
    unsigned long ulOutputTemp2;
}StructTest; 

//定义功能函数
void func3(unsigned long* ulInputTemp, StructTest* sTest)
{
    unsigned long ulValue1 = 10;
    unsigned long ulValue2 = 20;

    sTest->ulOutputTemp1 = *ulInputTemp+ulValue1;
    sTest->ulOutputTemp2 = ulValue2;
}

//应用部分
StructTest x_Test = {0, 0};
unsigned long ulInputValue = 3;
func3(&ulInputValue, &x_Test);printf("x_Test.ulOutputTemp1 = %d\n", x_Test.ulOutputTemp1);printf("x_Test.ulOutputTemp2 = %d\n", x_Test.ulOutputTemp2);

最终的结果:

x_Test.ulOutputTemp1 = 13x_Test.ulOutputTemp2 = 13

可以利用这个结构体,方便的带出你想要的东西,很方便,也很灵活


				
时间: 2024-12-17 05:33:07

函数参数传递出结果的相关文章

C++函数参数传递终极版转。

函数调用的作用: ·用实参数向形式参数传递数据: ·为获得数据参数及在函数体中声明的变量分配存储空间: ·中断现行(调用)函数,把流程向被调用函数的入口处,开始执行被调函数.当参数表为空时,表示该函数不从调用函数接受数据. 函数参数传递机制 堆栈存储区是主调函数(过程)和被调用函数(过程)在调用发生时进行通信的主要区域.  基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value): 被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了 内存空间以存放由主调函

C/C++中的函数参数传递机制

对函数的形参感兴趣的可以看一下 一. 函数参数传递机制的基本理论 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递.以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为

二维数组指针作为函数参数传递

以前二维数组作为函数参数传递我都是这么写的void def(int a[][10]).传递一个二维数组a,(其中第二维要确定大小)其实想一想挺合理的... 后来,发现还有这种写法 void def(int(*a)[10]): /* *********************************************** Author :guanjun Created Time :2017/3/18 13:32:52 File Name :33.cpp *******************

【解迷糊】关于PHP的extract()函数提取出的变量的作用域问题

真理:该函数提取出的变量遵循 变量作用域 的原则,见下图: 四种情况: class Test { public function dosome() { $arr = ['x' => 'xing', 'y' => 'ya']; extract($arr); } public function get() { return $x; } } $test = new Test(); $test->dosome(); $a = $test->get(); echo $a; //无法打印 $a

【转载】函数参数传递(值传递,指针传递)

C语言值传递 地址传递 : 1.值传递 eg: 1     void Exchg1(int x, int y)   2     {   3          int tmp;   4          tmp = x;   5          x = y;   6          y = tmp;   7          printf("x = %d, y = %d\n", x, y);   8     }   9     main()  10     {  11        

Python的函数参数传递 和 global

函数的参数到底是传递的一份复制的值,还是对内存的引用? 我们看下面一段代码: a = [] def fun(x): x.append(1) fun(a) print(a) 想想一下:如果传递的是一份复制的值,那么列表a应该是不会变化的,还是空列表:如果传递的是引用,那么a应该是[1]. 执行一下看到输出结果是[1],即证明函数参数传递的是引用. 但是,再看下面的代码: a = 1 def fun(x): x = 2 return x ret = fun(a) print(a) print(ret

二维数组作为函数参数传递剖析

前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...} //以下两种可以忽略行数 f(int daytab[][13]) {...} f(int (*daytab)[13]) {...} 甚至会有人告诉你多维数组作为参数传递可以省略第一维,其他维不能省略.然而你对这种形式并不满意:如果事先限定了二维数组的大小,函数的泛用性就要大打折扣了.因为你真正需要的,

(C++)函数参数传递中的一级指针和二级指针

(C++)函数参数传递中的一级指针和二级指针 主要内容: 1.一级指针和二级指针 2.函数指针传递的例子 3.什么时候需要传递二级指针? 4.二级指针在链表中的使用 1.一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址: 二级指针:指向指针的指针,就是地址的地址: 如: int a=1; int *p=&a; // p为a变量的地址,通过*p可以得到a的值 int **q=&p; // q为p指针的地址,通过**q可以得到a的值 2.函数指针传递的例子 程序1: 1 2 3

js中的类型和函数参数传递类型问题

js中的类型: 2大类型:原始类型和对象. 原始类型有 boolean.number.string这三个普通原始类型,还有null.undefined这俩特殊原始类型 对象嘛就多了,普通对象.内置对象.全局对象.函数.数组等. 函数参数传递类型: 对于原始类型,传递的是值,即复制一份传入函数,在函数内部修改不影响外部变量本身. 对于对象类型,传递的是地址,在函数内部修改对象时会导致外部变量发生变化. 注意这种情况!参考如下代码: var oMyObj = {name:"罗伯特"}; f