学习笔记之——C语言 函数( 二 )


函数例子:
#include<stdio.h>
int add(int x,int y) //这里为形式参数,用于接收实际参数的值
{
int z=0;
return z=x+y;
}
int main()
{
int a=0;
int b=0;
scanf(“%d  %d”,&a,&b);
add(a,b);  //这里是实际传过去的参数,要与对应函数的参数类型和数量对应 。这里是为函数传递实际参数
return 0;
}
5、 函数的调用
传值调用
函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参
传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的 一种调用函数的方式
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接处理外部的变量
int add(int x,int y)
{
int z=0;
return z=x+y;
}
int add2(int* x,int* y)
{
int z=0;
return =*x+*y;
}
int main()
{
int a=0;
 int b=9;
scanf(“%d %d”,&a,&b);
printf(“%d\n”,add(a,b));   //传值调用
printf(“%d\n”,add2(&a,&b));   //传址调用
return 0;
}
6、 函数的嵌套调用和链式访问
嵌套调用
函数和函数之间可以有机的组合的
例:
int main()
{
int a=0;
int b=0;
scanf(“%d %d”,&a,&b);
add(a,b);
add2(&a,&b);  //本句与上一句组成嵌套函数(没搞懂)
return 0;
}
链式访问
把一个函数的返回值作为另一个函数的参数
int add(int x,int y)
{
int z=0;
return  z=x+y;
}
【学习笔记之——C语言 函数】int add2(int * x,int * y)
{
int z=0;
return z=*x+*y;
}
include<stdio.h>
int main()
{
int a=0;
int b=0;
scanf(“%d %d”,&a,&b);
printf(“%d\n”,add(add2(&a,&b),add2(&a,&b)); //链式访问
return 0;
}
7、 函数的声明和定义
函数声明
1) 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,但是具体是不是存在,无关紧要
2) 函数的声明一般出现在函数使用之前,要满足先声明后使用
3) 函数的声明一般要放在头文件中
注:以博客作者的井字棋为例:
#include “game.h”   //引用头文件
//棋盘
void.showborad(char board[row][col],int row,int col);//声明
//函数的定义
//函数的定义是指函数的具体实现,交代函数的功能实现
//初始化棋盘
void showborad(char board[row][col],int row ,int col)
{
int i=0;
int j=0;
for(i=0;i<row;i++)
  {
for(j=0;j<col;j++)
{
   board[i][j]=’ ’;
printf(“%c”,board[i][j]);
  if(j<col-1)
{
printf(“|”);
}
}
printf(“\n”);
for(j=0;j<col;j++)
{
printf(“-“);
if(j<col-1)
{
printf(“|”);
}
}
printf(“\n”);
 }
}
8、 函数的递归
什么是递归
程序调用自身的编程技巧称为递归,递归作为一种算法在程序设计语言中广泛应用,一个过程或函数在其定义活说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题蹭蹭转化为一个与原题目相似的规模较小的问题来求解,递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算,大大的减少了程序的代码量,递归的主要思考方式在于:把大事化小
递归的两个必要条件
1) 存在限制条件,当满足这个限制条件的时候,递归便不再继续

经验总结扩展阅读