函数的基本用法
main函数
int main(int argc,const char * argv[]){
printf("Hello World\n");
return 0;
}
数据类型 函数名称(参数){
//……
return 0;
}函数
函数是一个完整特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值
一般形式如下
<数据类型> <函数名称> (<形式参数说明>){
语句序列;
return[(<表达式>)];
}<数据类型>是整个函数的返回值类型,return[(<表达式>)]语句中表达式的值,要和函数<数据类型>保持一致,如无返回值应写void型<形式参数说明>是逗号“,”分割的多个变量的说明形式
大括号对{<语句序列>},称为函数体;<语句序列>是大于等于零个语句构成的
编写函数,输出Hello World
#include <stdio.h>
void print_hello() {
printf("Hello World\n");
}
int main(){
print_hello();
return 0;
}
//Hello World函数的调用
函数的使用也叫函数的调用,形式如下:
函数名称 (<实际参数>)对于无返回值的函数来讲只能形成一个函数调用语句
函数调用可以作为一个运算量出现在表达式中,也可以单独形成一个语句
//写一个函数,求两个数谁大
#include <stdio.h>
int get_max(int a , int b){
if (a < b){
return b;
} else{
return a;
}
}
int main(){
int i,j;
int ret;
printf(">");
scanf("%d %d",&i,&j);
ret = get_max(i,j);
printf("max:%d\n",ret);
return 0;
}函数的声明
函数的说明就是指函数原型
其中,<形式参数说明>可以缺省说明的变量名称,单类型不能缺省
例如,
double power(double,int)编译器从上往下顺序进行编译
#include <stdio.h>
int get_max(int,int);//函数的声明
int main(){
int i,j;
int ret;
printf(">");
scanf("%d %d",&i,&j);
ret = get_max(i,j);
printf("max:%d\n",ret);
return 0;
}
int get_max(int a , int b){
if (a < b){
return b;
} else{
return a;
}
}函数的应用
定义求xn值的函数(x是实数,n是正整数)
#include <stdio.h>
double fun_pow(double x,int n);
int main(){
double x = 2;
int n = 10;
printf("%lf\n",fun_pow(x,n));
return 0;
}
double fun_pow(double x, int n){
int i;
double ret = 1;
for (i = 0; i < n; i++){
ret *= x;
}
return ret;
}
//1024.000000函数传参
什么是形参
形参全称为“形式参数”
形参是在定义函数的时候使用的
目的是用来接收调用该函数时传递的参数
什么是实参
实参全称为“实际参数”
实参是在调用时传递给函数的参数,即传递给被调用函数的值
在主调函数中调用一个函数时,函数名后面括号中的参数(可以是表达式)称为“实际参数”
什么是参数传递
在程序运行过程中,将实际参数的值或者地址传递给被调用函数的形式参数,从而在函数中完成对数据处理和返回的过程。
在C语言中,参数的传递方式本质上只有一种,就是值传递。但为了更好区分理解,划分了三种方式:
全局变量
值传递方式
指针传递方式
全局变量
全局变量就是在函数体外说明的变量
全局变量一经定义后就会在程序的任意地方可见
函数调用的位置不同,程序的执行结果可能会受到影响。不建议使用
值传递方式
调用函数将实参传递给被调用函数,被调用函数将创建同类型的形参并用实参初始化
形参是新开辟的内存空间,在函数中改变形参的值,不会影响到实参
#include <stdio.h>
void fun_swap(int a, int b);
int main(){
int x = 100, y = 200;
printf("before:x=%d y=%d %p %p\n",x, y, &x, &y);
fun_swap(x, y);
printf("after:x=%d y=%d %p %p\n",x, y, &x, &y);
return 0;
}
void fun_swap(int a, int b){ //int a=x; int b=y;
int t = a;
a = b;
b = t;
printf("a=%d b=%d %p %p\n",a, b, &a, &b);
}
/*
before:x=100 y=200 0x7ffcc1b0cd00 0x7ffcc1b0cd04
a=200 b=100 0x7ffcc1b0ccdc 0x7ffcc1b0ccd8
after:x=100 y=200 0x7ffcc1b0cd00 0x7ffcc1b0cd04
*/案例-求n内的素数
打印n以内所有的素数,并统计素数的个数 (素数是指只能被1和它本身整除的正整数,1不是素数
方法一:定义函数:判断一个数是否为素数
#include <stdio.h>
int fun_prime(int n);
int main(){
int n;
int i;
int sum;
printf(">");
scanf("%d",&n);
for(i = 1; i < n; i++){
if (fun_prime(i)){
printf("%d\n",i);
sum++;
}
}
printf("sum=%d\n",sum);
return 0;
}
int fun_prime(int n){
int i;
if (n == 1){
return 0;
}
for (i = 2; i < n; i++){
if (n % i == 0){
return 0;
}
}
return 1;
}
/*
>100
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
sum=25
*/方法二:定义函数:统计n以内的所有素数
#include <stdio.h>
int fun_prime(int n);
int fun_prime_sta(int n);
int main(){
int n;
int count;
printf(">");
scanf("%d",&n);
count = fun_prime_sta(n);
printf("count=%d\n",count);
return 0;
}
int fun_prime(int n){
int i;
if (n == 1){
return 0;
}
for (i = 2; i < n; i++){
if (n % i == 0){
return 0;
}
}
return 1;
}
int fun_prime_sta(int n){
int i;
int sum = 0;
for (i = 1; i < n; i++){
if (fun_prime(i)){
printf("%d\n",i);
sum++;
}
}
return sum;
}
/*
>100
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
count=25
*/指针传递方式
按地址传递,实参为变量的地址,而形参为同类型的指针
被调用函数中对形参的操作,将直接改变实参的值
被调用函数对指针的目标操作,相当于对实参本身的操作
写一个函数,实现两个数据的交换
#include <stdio.h>
void fun_swap(int * p, int * q);
int main(){
int m = 10, n = 20;
printf("before:m=%d,n=%d\n",m,n);
fun_swap(&m, &n);
printf("after:m=%d,n=%d\n",m,n);
return 0;
}
void fun_swap(int * p, int * q){ //int * p = &m, int * q = &n
int t;
t = *p;
*p = *q;
*q = t;
}
/*
before:m=10,n=20
after:m=20,n=10
*/