c primer plus 专题9:函数

1 复习函数

1 函数组成

函数原型:告诉编译器函数的类型。和变量一样,任何函数使用前都要先声明类型;

函数调用:表明在此处执行函数;

函数定义:即使函数的具体实现,明确的指定了函数要做什么。

2 定义带形式参数的函数

3 声明带形式参数函数的原型

// 方式一
void show_n_char(char ch, int num);    // 声明函数原型
// 方式二
void show_n_char(char, int);            // 省略变量名

4 调用带实际参数的函数

5 使用 return 语句返回值

关键词 return 后面的表达式的值,就是函数的返回值。

return 可以返回变量值,表达式的值;使用 return函数的另一个作用,终止函数,因此可以在函数中使用多个 return 语句

// return 返回变量的值
int min(int num1, int num2)
{
    int min_num;
    if (num1 < num2)
        min_num = num1;
    else
        min_num = num2;
    
    return min_num;
}

// return 返回表达式的值
int min(int num1, int num2)
{
    return (num1 < num2) ? num1 : num2;
}

// 在函数中使用多个 return
int min(int num1, int num2)
{
    if (num1 < num2)
        return num1;
    else
        return num2;
}

2 递归

1 递归介绍

简单的递归程序:

#include <stdio.h>
void up_and_down(int n);
int main(void)
{
	up_and_down(1);

	return 0;
}

void up_and_down(int n)
{
	printf("Level %d: n location %p\n", n, &n);
	if (n < 4)
		up_and_down(n + 1);
	printf("Level %d: n location %p\n", n, &n);
}

执行结果:

2 汉诺塔递归程序

/**
 * @brief 参考链接:https://blog.csdn.net/weixin_42145502/article/details/83686673
 */

#include <stdio.h>
void move(char ch1, char ch2);
void hanoi(int n, char A, char B, char C);

int main(void)
{
	hanoi(8, 'A', 'B', 'C');

	return 0;
}

void move(char ch1, char ch2)
{
	printf("%c ---> %c\n", ch1, ch2);
}

void hanoi(int n, char A, char B, char C)
{
	if (n == 1)
		move(A, C);
	else
	{
		hanoi(n - 1, A, C, B);
		move(A, C);
		hanoi(n - 1, B, A, C);
	}
}

3 尾递归

尾递归,就是将递归调用置于函数的末尾。这是最简单的递归形式,相当于循环。

// 递归计算阶乘
long rfact(int n)
{
    long ans;

    if (n > 0)
        ans = n * rfact(n - 1);
    else
        ans = 1;

    return ans;
}

4 递归函数的优缺点(使用简单,但消耗内存)

3 指针

1 取地址运算符 &

执行结果

由于函数调用,传递的是值,那么原则上子函数无法更改主调函数的变量。怎么解决?使用指针传递地址。

2 指针简介

什么是指针?从根本上看,指针(pointer)是一个值为内存地址的变量。正如 char 类型变量的值是字符,int 类型变量的值是整数,指针变量的值是地址。

一个指针占几个字节?

因为指针存储的是地址,那么在32位系统中,指针占据4字节;63位系统中,指针占据8字节。

3 声明指针变量

int * pi;            // pi 是指向 int 类型变量的指针
char * pc;            // pc 是指向 char 类型变量的指针
float * pf, * pg;    // pf 和 pg 都是指向 float 类型变量的指针

注意,* 和 指针名之间的空格可有可无。通常,程序员在声明时使用空格,在解引用变量时省略空格。

4 使用指针在函数间通信

#include <stdio.h>
void interchange(int * u, int * v);

int main(void)
{
	int x = 5, y = 10;

	printf("Originally x = %d and y = %d.\n", x, y);
	interchange(&x, &y);		// 把地址发送给函数
	printf("Now x = %d and y = %d.\n", x, y);

	return 0;
}

void interchange(int * u, int * v)
{
	int temp;

	temp = *u;
	*u = *v;
	*v = temp;
}

函数传递值和传递指针的区别

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值