1、调用函数一定是在int main()外的
2、调用的子函数没有返回值,用void,否则会报错子函数没有返回值。
①有返回值
根据返回值类型来定义为int,并且在子函数结尾一定要写上return result(需要返回的值)
int main中需要
定义一个新的变量
去接收子函数返回的值
变量地址作为返回值
全局变量的生命期是永恒的,如果返回一个局部变量的地址会出现问题(变量在子函数中或者在if语句后出现都会随着程序的运行时变量失效)
#include <stdio.h>
int* get()
{
int num=1;
return #
}
int main()
{
int* p=get();
*p=12; //p指向的变量已经失效,不能用星号操作
return 0;
}
用法错误 ,因为get()函数返回的是一个局部变量的地址,当get()获取局部变量的地址返回后,局部变量num的生命周期结束,从而使指针p指向了一个无效的变量。正确程序如下,应该把num定义为全局变量
#include <stdio.h>
int num=1;
int* get()
{
return #
}
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 版权协议,转载请附上原文出处链接和本声明。