成为C++高手之如何同时返回两个值

关键字与标志符

关键字就是被C语言本身占用的那些字符串,比如:int,typedef。我们在定义变量或函数的名字时时要避开它们。

标志符就是我们定义的变量和函数的名字。

什么是结构

提出一个问题:写一个函数,计算两个数相除,要求同时返回商和余数,怎么写?

我们知道函数的返回值只能有一个,同时返回两个数这跟本不可能。但用结构就变为可能了!代码如下:

struct Result{
    int shang;
    int yu;
};

struct Result div(int a,int b){
    struct Result ret;
    ret.shang = a/b;
    ret.yu = a%b;
}

struct Result r = div(33432,44);

首先定义了结构Result,又定义了函数div,最后调用了函数。

注意以结构做为类型时,必须在结构名前带有关键字struct 。想不带也可以,那就需要用typedef为struct Result取个别名,这个名字可以仍然是Result,但这样就可以省掉关键字struct了(如果你的源文件是.cpp而不是.c,不用typedef 也可以省掉关键字struct)。如:

typedef struct Result{
    int shang;
    int yu;
}Result;

Result div(int a,int b){
    struct Result ret;
    ret.shang = a/b;
    ret.yu = a%b;
}

Result r = div(33432,44);

可以看到结构出现的目的很简单:把一坨相关的变量,弄到一起,作为一个整体使用。

结构其实是一种自定义类型,就像系统已有的类型int ,long 等一样。

访问结构中的变量的方式是用“.”。结构中的变量叫成员变量。

结构也可以作为函数的参数。

输出参数

两数相除同时返回商和余数的函数还有另一种写法。这种写法使用“输出参数”。前面讲的例子中,参数都是传入函数中的,让我们觉得参数就是向函数内传值的(这叫输入参数),但其实参数也可以让外部从函数内接收值。这就相当于返回的作用了。看一下新函数的写法:

int div(int a,int b,int *yu){
    *yu = a%b;
    return a/b;
}

int yu;
int shang = div(33432,44,&yu);

注意div函数的第三个形参叫yu,而调用div函数时,第三个实参传入的变量也是yu,注意这两个yu不是一个东西。函数的形参只在函数内部起作用,所以外部变量与函数形参同名没问题 。

函数div返回的是商,而余数是通过形参yu返回的。

注意int 中的“”表示指针。指针中存放的是另一个变量的地址。所以在调用div时,第三个参数是&yu。“&”表示取地址。 在执行div函数时,参数yu保存的是外部变量yu的地址。通过地址操作变量用这种方式:*指针(这里是 *yu)。

外部变量yu在定义时,就具有了身体,占用一块内存(int型变量占据4个字节的内存),所以取它的地址时才能取到有效的地址。初学者常犯这样的错误:

int *yu;
int shang = div(33432,44,yu);

这样就会引起崩溃,因为你虽然你传入的的确是个指针,但这个指针并没有指向有效的内存,div中用这个地址操作所指向的变量,那这个变量在哪里呢?仔细与上面对比,你就能明白。

关于指针的深入解释,请其待我的另一篇文章:“让你彻底明白指针”。

上一篇:成为C++高手之轻松理解二进制

时间: 2024-11-07 10:09:20

成为C++高手之如何同时返回两个值的相关文章

【C语言】编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。

/*编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数. 例如:输入传入(0 , 5)函数返回5,传入(10 , 9)函数返回1,传入(12 , 4)函数返回4 */ #include <stdio.h> int yue(int a,int b) { int temp; int n; if (a>b) { temp=a; a=b; b=temp; } n=a; if(a==0) return b; else while(n!=0) { if( a%n==0 &&

一个方法返回多个值

public class TwoTuple<A,B>{   public final A a; public final B b; public TwoTuple(A a,B b){ this.a=a; this.b=b; } } 这样我们可以通过new TwoTuple(A,B)返回两个值. 原文在<Java编程思想>第四版,泛型章节P335

三种方法实现从“一个(组)查询过程中返回两个表的查询结果”

还记得開始做机房的时候,遇到了要从一个函数中返回两个表的查询结果.当时的解决方法非常"冲动"也非常"无拘无束",直接在实体类里边加入了其它表的实体,效果是达到了,但总认为不伦不类. 如今介绍三种解决上述问题的方法(代码为VB.net.系统使用三层架构). 题设要求:如果我如今要从卡表和学生表里返回查询信息(卡表的comment,money,status和学生表的所有信息),卡表和学生表例如以下: 图一  学生表 图二    卡表 方法一:视图. 比較简单,相信这样的

startActivity(intent); 启动 类文件出现 返回两次才可以到上级界面纠结

Intent intent = new Intent(); intent.setClass(School.this, Setting.class); startActivity(intent); 在纠结这个问题的时候也在考虑 是不是 .setClass 函数是否 前面个参数是设置 起始对象 startActivity(intent); 启动 类文件出现 返回两次才可以到上级界面纠结

JavaScript使用Max函数返回两个数字中较大数的代码

JavaScript使用Max函数返回两个数字中较大数的代码. JavaScript的Math对象带有一个max函数用于获取两个数字的较大数代码: <p id="demo"> Click the button to return the highest number of 5 and 10. </p> <button it</button> <script> function myFunction() { document.getE

Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值

目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针.来看个小案例 #include<stdio.h> #include<stdlib.h> /** 指针就是内存地址 内存地址就是指针 */ main() { //定义一个int类型的变量i,并且赋值为10 int i=10; //定义一个int类型的一级指针变量p int* p; //把i对应的地址给p变量 p=&i; //指针取值*p:把p变量地址对应的值取出来 printf(&q

MySQL返回两个时间的指定时差自定义函数

上面是运行效果预览图, 具体内容请移步至MYSQL自定义函数返回两个时间的指定时间差

实现一个数值加法函数,返回两个数字的和。要求能进行参数验证,若参数不是数字或为空则抛出异常。

<body> <script type="text/javascript"> function Sum(arg1,arg2){ //数值加法函数 var sarg1 = new String(arg1); //将传入的参数转为字符串以便进行参数检查 var sarg2 = new String(arg2); //将参数2转为字符类型 if( (sarg1=="")||(sarg2=="") ) //确保参数不为空 { va

sql返回两个日期之间的日期_函数实现

-- Description:返回两段日期之间的所有日期    <Description,,>-- =============================================CREATE FUNCTION [dbo].[GetBetweenDate] (        @StartTime DATETIME        --开始日期  ,@EndTime DATETIME        --结束日期)RETURNS  @TABLE table (BetweenDate DAT