本文约2200字,主要讲了C语言基础之函数,递归,数组作为函数参数以及案例、练习题等。

带你进入C语言的世界,入门C语言,后边将持续更新。可以收藏学习。想了解C语言基础之函数,函数的基本概述,函数的调用关系,函数的一般形式,函数参数和函数的值以及例题等请点击该处跳转阅读。

本文全干货,新手必备,感谢你的阅读,祝你学有所成,生活愉快!


一、函数的嵌套调用

嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数的完整定义。然而,C语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。

main(){

a();

}

a(){

b();

}

b(){

return;

}

二、递归

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。

例如:

int f(int x)

int y,z;

z=f(y);

return(2*z);

案例1:汉诺塔问题

由上面的分析可知:将n个盘子从A座移到C座可以分解为以下3个步骤:

(1) 将A上n-1个盘借助C座先移到B座上。

(2) 把A座上剩下的一个盘移到C座上。

(3) 将n-1个盘从B座借助于A座移到C座上。

#include

main()

{

void hanoi(int n,char one,char two,char three); /* 对hanoi函数的声明 */

int m;

printf("input the number of diskes:");

scanf("%d", &m);

printf("The step to moveing %d diskes:", m);

hanoi(m, 'A', 'B', 'C');

}

void hanoi(int n, char one, char two, char three) /* 定义hanoi函数, 将n个盘从one座借助two座,移到three座 */

{

void move(char x, char y); /* 对move函数的声明 */

if( n==1 )

{

move(one, three);

}

else

{

hanoi(n-1, one, three, two);

move(one,three);

hanoi(n-1,two,one,three);

}

}

void move(char x, char y) /* 定义move函数 */

{

printf("%c-->%c", x, y);

}

三、数组作为函数参数

数组可以作为函数的参数使用,进行数据传送。数组用作函数参数有两种形式。

一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。

1.数组元素作函数实参

数组元素就是下标变量,它与普通变量并无区别。因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。

2.数组名作函数参数

用数组名作函数参数与用数组元素作实参有几点不同:

1) 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。

然而,用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,即会发生错误。

2) 在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。

在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。

3.数据的传送实现

数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。

形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。

例如:

void test(int b[10]);

void main()

{

int a[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};

test(a);

putchar('');

}

void test(int b[10])

{

int i = 0;

for( ; i < 5; i++ )

{printf("%d ", b[i]);}}

4.内存数组的存储:

例题2:有一个一维数组score,内放10个学生成绩,求平均成绩(写一个average函数求平均成绩)。

#include

double average(double array[10]); /* 函数声明 */

main()

{

double score[10] = {82, 100, 87.5, 89, 78, 85, 67.5, 92.5, 93, 94}, result;

result = average(score);

printf("average score is %5.2lf", result);

putchar('');

}

double average(double array[10])

{

double result = 0;

int i = 0;

for( i=0; i < 10; i++ )

{

result += array[i];

}

result /= 10;

return result;

}


感谢您的阅读,希望有所收获!会持续更新!

c语言函数调用数组_第七讲:C语言基础之函数,第二节,实现汉诺塔相关推荐

  1. 入门C语言第二话:函数(上)之锻体篇,带你玩转函数(内有汉诺塔,青蛙跳台阶等经典问题,建议收藏和分享)

    文章目录 前言 概念的引入 大纲 一.函数的定义 二.函数的分类 1.库函数 概念引入 库函数的分类 了解五步骤 例1: 1.介绍printf 2.头文件 3.所传参数及其类型 4.返回类型及其返回值 ...

  2. FishC笔记—23,24 讲 递归:这帮小兔崽子,汉诺塔

    本期内容详解: 斐波那契数列的两种实现方式: 迭代的方式: def fab(n): n1 = 1 n2 = 1 n3 = 1 if n < 1: n = int(input('输入有误,请重新输 ...

  3. 小甲鱼Python第二十三讲、第二十四讲(递归-这帮小兔崽子、汉诺塔)

    def fab(n):迭代的方法if n<1:return -1while(n-2)>0:n3=n2+n1n1=n2n2=n3n=n-1return n3 def rabbit(n):递归 ...

  4. 汉诺塔递归的c语言实现(递归)

    对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了,   每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h>void move(i ...

  5. C语言递归函数——汉诺塔问题笔记

    C语言递归函数--汉诺塔问题笔记 学C的时候老师根本没讲过递归,当时自己也没把它当回事,但是递归在算法中的地位实在太重要了.于是翻了翻C课本上的递归,书上讲的不多,但是一个经典的汉诺塔问题就让我伤透了 ...

  6. c语言 汉诺塔游戏下载,使用C语言解决益智游戏——“汉诺塔”

    说明: 文章所有内容截选自实验楼教程[3个C语言实例带你掌握递归方法论],教程里还有两个实例,感兴趣的可以点击查看: 文章主要是带你通过解决这个游戏来利用递归解决实际问题并掌握其核心思想,懂得如何使用 ...

  7. 汉诺塔细讲(内含邻近,循环。以及作者对汉诺塔,以及分治算法的小感悟,注释)

    小伙伴们大家好,今天是我第一次尝试去发文写作,有不好之处请多多包含. 什么是汉诺塔呢? 其实大家已经很熟悉他了(而且这是我的第一个递归题目) 注意:本章统一是将从第一根柱子转移到第三根柱子 汉诺塔(T ...

  8. Js与Jq实战:第七讲:jQuery基础

    第七讲:jQuery基础 一.预习笔记 1.jQuery的简述 2.jQuery对象与JS对象 3.jQuery的基本选择器 4.jQuery层次选择器 5.jQuery基本过滤选择器 6.jQuer ...

  9. python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...

    汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...

最新文章

  1. linux登陆界面卡死_Linux 上最好的五款音乐播放器
  2. 在日本山区流域使用支持向量机和 bagging、boosting 和 stacking 集成机器学习框架改进滑坡评估--文献阅读
  3. python时间序列预测不连续怎么办_python – 不连续的时间序列在x轴上绘制日期
  4. 新闻平台聚合之新浪新闻爬虫发布
  5. JavaWeb项目—— 博客系统
  6. java开发kpi考核_如何量化考核技术人的KPI?
  7. paraview:python脚本
  8. linux ap中继模式,小米AIoT AX3600 WiFi 6有线中继模式(AP模式)自定义局域网LAN IP地址...
  9. 华为路由器配置VRRP
  10. VB 获取文件名后缀
  11. gomonkey permission denied
  12. 电气绘图软件EPLAN在WIN10详细安装教程
  13. vue+element ui 项目 后台管理系统
  14. H5 Handlebars的简单使用
  15. 前端JavaScript代码混淆加密原理介绍
  16. 计算机类普刊有哪些,基础数学类的容易发表的普刊有哪些
  17. The class file xxx contains a signature 'xxx;' ill-formed at position 6 问题的解决
  18. fatal:unable to create “D:/“ file existsanother git process seems to be running in this repository
  19. java基础面试题题库五(传智专修学院2017级Java4班)
  20. *Codeforces891E. Lust

热门文章

  1. vue-resource
  2. Gradle Introduction
  3. Vue中的Js动画与Velocity.js 的结合
  4. mybatis 使用merge into
  5. Java多线程:线程间通信之volatile与sychronized
  6. MVC View显示详解(RenderBody,RenderPage,RenderSection,Partial)
  7. java基础知识系列---垃圾收集
  8. 家纺B2C优雅100获IDG及DCM 1000万美元投资
  9. Microsoft SharePoint Server 2010 的新增功能
  10. matlab impdt,实验1 基于Matlab的数字信号处理基本操作