C语言返回值函数用法

C语言返回值函数用法,第1张

无参无返回值类型函数是 void ss(void)
无参有返回值类型函数是 int ss(void)这就表示函数的返回值是int类型的,你可以改为你想要的任何类型
有参有返回值类型函数是 int ss(int x,int y)这就表示函数的返回值是int类型的,且函数具有两个参数,且两个参数都是int类型的。当然你可以改为你想要的任何在C里面支持的类型。。
实际上参数就是你需要传递给函数进行处理的值,返回值就是指你的函数当处理完传递的参数过后需要传回给调用函数的一个值得。。

i的值 需要在主函数中调用赋值

#include<stdioh>
int func()
{
    int i;
    char str1[] = { "How are you!" };
    for (i = 0;str1[i] != '\0';i++)
    ;
    return i;
}
int main()
{
    int i = func();
    printf("%d",i);
}

return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么。
return 语句可以有多个,可以出现在函数体的任意位置,但是每次调用函数只能有一个 return 语句被执行,所以只有一个返回值(少数的编程语言支持多个返回值,例如Go语言)。 扩展资料

函数一旦遇到 return 语句就立即返回,后面的所有语句都不会被执行到了。从这个角度看,return 语句还有强制结束函数执行的作用。

return 语句是提前结束函数的唯一办法。return 后面可以跟一份数据,表示将这份数据返回到函数外面;return 后面也可以不跟任何数据,表示什么也不返回,仅仅用来结束函数。

你可以这么理解,比如我们定义了一个函数fun(),如果这个函数有返回值,那么在调用程序里面(比如主函数)就可以把这个函数当成一个数使用;如果没有返回值,那么通常他就是一个独立的语句存在。
比如fun函数里面有个return 0;表示返回值是零,那么在调用函数里面就可以存在诸如
a=fun();b=a+fun();if(fun()>=0{};……这类的语句,表示a=0;b=a+0;if(0>0){};等等,当然也可能是返回一个变量的值,你个指针的值是一样的。
如果没有return 语句,那么函数没有返回值,调用函数里面就不能把他当做一个数值来使用,会出现:
fun();单独成句的语句,在fun()里面可能进行了一些 *** 作,但不需要结果。
C语言自带的函数通常都有返回值,计算函数返回计算结果, *** 作函数返回 *** 作结果(成功返回1,失败返回0)

int hehe(int n) {
    if(n<=1) return 1;
    return n  hehe(n-1);
}

我们一点一点来看:

首先 n = 0 传入,if条件满足 返回 hehe(0) = 1

在传入 n = 1, if条件还是满足 返回 hehe(1) = 1

我们传入参数 n = 2, if 条件不满足 hehe(2) = 2 hehe( 2 - 1 )= 2 1

在我们传入 n =3 , if条件不满足 hehe(3) = 3 hehe(2) ==> 3 2 1

你继续这个步骤 ,对任何正整数n

hehe(n) = n hehe(n-1) = n (n-1) 1

明白了吗?!

导语:编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题。以下是引导学生采用的三种不同方法编写多个返回值的C语言函数,一起来学习下吧:

方法1:利用全局变量

分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。下面以一个实例演示该方法的应用。

实例1:编写函数求3个数中的最大值与最小值。

方法:把最大值、最小值分别定义成2个全局变量max、min,在用户自定义函数中把求出来的最大值与最小值分别赋给全局变量max、min。函数调用完毕后全局变量的max、min值即保存了函数要求返回的值。程序参考代码如下:

#include "stdioh"

#include "conioh"

int max,min;/定义两个全局变量用于保存函数返回值/

void max_min(int a,int b,int c) /定义求最大最小值的函数/

{max=min=a; /初始化最大最小值/

if(max if(max if(min>b)min=b;

if(min>c)min=c;

}

main()

{int x,y,z;

printf(" 请输入3个整数: ");

scanf("%d,%d,%d",&x,&y,&z);

max_min(x,y,z) ;/调用求最大值与最小值的函数/

printf("三个数中的最大值为:%d;最小值为:%d",max,min);/输出最大值与最小值/

getch();

}

调试结果如下:

请输入3个整数:

5,-6,2

三个数中的最大值为:5;最小值为:-6

注意:该方法虽然可以实现有多个返回值的函数,但由于全局变量不能保证值的正确性(因为其作用域是全局,所以程序范围内都可以修改它的值,如果出现错误将非常难以发现),并且全局变量增加了程序间模块的耦合,所以该方法要慎用。

方法2:传递数组指针

分析:在教学过程中,我们知道C语言函数参数的传递方式有值传递与地址传递。当进行值传递时,主调函数把实参的值复制给形参,形参获得从主调函数传递过来的值运行函数。在值传递过程中被调函数参数值的更改不能导致实参值的更改。而如果是地址传递,由于传递过程中从实参传递过来的是地址,所以被调函数中形参值的更改会直接导致实参值的更改。因此,我们可以考虑把多个返回值作为数组元素定义成一个数组的形式,并使该数组的地址作为函数的形式参数,以传址方式传递数组参数。函数被调用后,形参数组元素改变导致实参改变,我们再从改变后的实参数组元素中获得函数的多个返回值。以下实例演示该方法的应用。

实例2:编写函数求一维整形数组的最大值与最小值,并把最大值与最小值返回给主调函数。

方法:以指针方式传递该一维数组的地址,然后把数组的最大值与数组的'第一个元素交换,把数组的最小值与最后一个元素交换。函数被调用完毕后,实参数组中的第一元素为数组的最大值,实参数组中最后一个元素为数组的最小值,从而实现返回数组的最大值与最小值的功能。程序参考代码如下:

#include "stdioh"

#include "conioh"

void max_min(int ptr,int n) /定义求数组最大值最小值的函数,传递数组指针/

{int i,j,k;/j保存最大值所在位置,k保存最小值所在位置/

int temp;/用于交换位置/

temp=ptr;

for(i=0;i{

if(ptr<(ptr+i))/最大值与第一个元素进行交换/

{

k=i;

temp=ptr;

ptr=(ptr+k);

(ptr+k)=temp ;

}

if((ptr+n-1)>(ptr+i))/最小值与最后一个元素进行交换/

{

j=i;

temp =(ptr+n-1);

(ptr+n-1)=(ptr+j);

(ptr+j)= temp ;}

}

}

/调用最大最小值函数/

main()

{

int A[6],i;

for(i=0;i<6;i++)

scanf("%d",&A[i]);

max_min(A,6);

printf("max=%d, min=%d ",A[0],A[5]);

getch();

}

调试结果如下:

请输入6个整形数,以空格隔开:

5 8 9 32 -6 4

max=32,min=-6

注意:该方法适用于多个返回值的数据类型一致的情况。当返回值数据类型不一致时,不适用该方法。

方法3:传递结构体指针

分析:结构体作为教学中的一个难点,教材对它介绍的内容并不多,应用的实例更是少之又少,所以学生对于结构体普遍掌握情况不理想。其实,编写返回多个值的C语言函数,也可以考虑采用结构体的方式去实现。通过方法2,我们知道如果返回的数个数值的数据类型不一致,可以通过定义全局变量实现有多个返回值的C语言函数,也可以考虑把要求返回的数个值定义成一个结构体,然后同样以传递结构体指针方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改即是对实参结构体的修改,函数被调用后获取的实参结构体成员即为函数的多个返回值,下面以实例演示该方法的应用。

实例3:编写一个用户自定义函数,允许用户录入学生的基本信息(包括学号、姓名、所属班级、总评成绩),并返回这些基本信息给主调函数。

方法:把学生基本信息定义成一个结构体,在用户自定义函数中传递该结构体的指针,则自定义函数中对结构体成员的录入 *** 作即是对实参结构体成员的录入 *** 作,从而实现多个返回值。参考代码如下:

#include "stdioh"

#include "conioh"

struct inf{/定义学生结构体,分别包含成员学号、姓名、班别、总评成绩/

char xh[12];

char name[20];

char class[15];

int chj;

};

main(void)

{

struct inf a1; /定义学生结构体类型变量/

void xxxx(struct inf ptr);

printf("请输入学号,姓名,班别,总评成绩,以空格隔开: ") ;

xxxx(&a1);/调用函数,以学生结构体类型变量地址作为实参/

printf("学号:%s,姓名: %s,班别:%s,总评成绩:%d",a1xh, a1name,a1class,a1chj);

getch();

}

void xxxx(struct inf ptr)/该函数实现对结构体成员数据的录入 *** 作/

{

char xh1[12],name1[20],class1[15];

int chj1;

scanf("%s%s%s%d",xh1,name1,class1,&chj1);

strcpy(ptr->xh,xh1);

strcpy(ptr->name,name1);

strcpy(ptr->class,class1);

ptr->chj=chj1;

}

调试结果如下:

请输入学号,姓名,班别,总评成绩,以空格隔开:

200102LiLi200185

学号:200102,姓名: LiLi,班别:2001,总评成绩:85

注意:当函数要求返回的多个值是相互联系的或者返回的多个值数据类型不一致时可以采用该方法。

总结

对于以上这三种方法,如果想要返回的数个值数据类型一致,可以考虑采用方法2;而对于不同数据类型的返回值,如果各个数值之间是相互联系的,则方法3较为合适;方法1虽然在很多情况下都可以实现多个返回值的C语言函数,但毕竟全局变量应用过程中有很多危险,要慎重使用。


1、通过使用指针,在函数调用时,传递带有地址的参数,并使用指针更改其值;这样,修改后的值就会变成原始参数。

2、通过使用指针返回结果为:

3、通过使用结构:因为结构是用户定义的数据类型;可以定义一个包含两个整数变量的结构,并将更大和更小的值存储到这些变量中,然后使用该结构的值。

4、通过使用结构返回结果为:

5、通过使用数组,当一个数组作为参数传递时,基地址将传递给该函数,因此无论对数组副本所做的任何更改,都会更改为原始数组。

6、通过使用数组返回结果为:


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12663724.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存