函数的用法和传参
  C

函数的用法和传参

 次点击
19 分钟阅读

函数的基本用法

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
*/

© 本文著作权归作者所有,未经许可不得转载使用。