C/C++自定义函数、返回值

  • Post author:
  • Post category:其他


1、调用函数一定是在int main()外的

2、调用的子函数没有返回值,用void,否则会报错子函数没有返回值。

①有返回值

根据返回值类型来定义为int,并且在子函数结尾一定要写上return result(需要返回的值)

int main中需要

定义一个新的变量

去接收子函数返回的值

变量地址作为返回值

全局变量的生命期是永恒的,如果返回一个局部变量的地址会出现问题(变量在子函数中或者在if语句后出现都会随着程序的运行时变量失效)

#include <stdio.h>

int* get()
{
    int num=1;
    return &num;
}

int main()
{
    int* p=get();
    *p=12;        //p指向的变量已经失效,不能用星号操作
    return 0;
}

用法错误 ,因为get()函数返回的是一个局部变量的地址,当get()获取局部变量的地址返回后,局部变量num的生命周期结束,从而使指针p指向了一个无效的变量。正确程序如下,应该把num定义为全局变量

#include <stdio.h>
int num=1;
int* get()
{
    return &num;
}

int main()
{
    int* p=get();
    *p=12;
    return 0;
}

再如

int main()
{
    int* p=0;
    if(1)
    {
        int a=123;        //a生命期开始
        int* p=&a;
    }                    //a生命期结束
    printf("%d\n",*p);
    return 0;
}

②返回值为bool类型(直接返回true或false )

// 判断a,b,c组成的三角形是否为直角三角形
bool check(int a, int b, int c)
{
	int aa = a * a;  // a的平方
	int bb = b * b;
	int cc = c * c;
	if (aa + bb == cc || aa + cc == bb || bb + cc == aa)
	{
		return true;
	}
	return false;
}

3、可以不用传入形参

void test()
{
	for (int i = 1; i <= 10; i++)
	{
		printf("%d \n", i);
	}
}

4、子函数的传值和传地址

① 传入变量值

#include <stdio.h>
#include <string.h>

void test(int a)
{
	a = a * a;
}

int main()
{
	int a = 10;
	test(a);
	printf("a: %d \n", a);

	getchar();
	return 0;
}

test(a)意思是把a的值传给函数,而不是说把a这个变量传给函数 ,通过编译器执行结果如下:

根据编译结果可知,虽然mian中的变量a与形参a名字上是相同的,但是对应着不同的内存地址,牢记:子函数对a值的修改不会影响到main中的a值

无论 test () 函数里面如何操作,对main()函数里的 a 没有影响,所以 a 值仍为 10

②传地址


#include <stdio.h>
#include <string.h>

void test(int* a)
{
	int n = *a;
	*a = n * n;
}

int main()
{
	int a = 10;
	test(&a);
	printf("a: %d \n", a);

	getchar();
	return 0;
}

传入变量地址(形参为一个int型变量地址),输出地址中的值a

在 test() 里,*a 的值变为100

所以最终输出的值为100

return语句只能有一个返回值

但是这个返回值可以是一个结构体或者是一个类,而结构体和类中可以容纳很多信息.

或者你也可以参考函数参数的方式来实现返回你所需要的信息,可以是多个.



版权声明:本文为qq_20386411原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。