菜鸡日记_C语言学习之函数

前言

​ 本菜鸡开始了学习C语言的旅途。用这个来记录一下上课所学到的一些东西。仅作为自己的一个学习笔记。里面的内容也只是我对学到的东西的一些理解,可能有很多错误,大佬们勿喷。如果发现我理解的有哪些是错误的,欢迎评论区指出,希望大佬们不吝赐教。

函数

1.定义

函数:相同代码封装,重复利用

C语言指令必须在函数内部

函数可以实现代码复用,实现模块化的设计

结构化程序设计者主张把一个大任务分成多个功能函数来完成

2.如何设计一个函数

设计函数:

  1. 确定函数功能,要完成的目标,确定函数名

    如:求一个数组的最大值

    ​ 函数名 array_max

  2. 完成该目标需要什么数据,传入参数

    如:求一个数组的最大值

    ​ 参数 数组名int a[10],数组元素个数

  3. 算法实现

  4. 完成后返回结果,返回值

    ​ return max

3. C语言函数语法形式

定义:

返回值类型 函数名(函数参数列表)

​ {

​ 代码…

​ }

   int test (int x, int y) 				//返回值类型为int型  函数名为test  需要两个int型的参数
   {
       .....
       .....
           return a;					//函数运行后返回a的值,如果没有return就返回了一个不知道是什么东西的值。
   }

注意: return 只能返回一个值。

4. 函数的调用过程

​ 函数调用:调用一个已经写好的函数去执行

​ 1):如何调用函数?

​ a.是调用哪个函数----指定调用函数的函数名

​ b.完成任务需要的参数—传入所需要的参数(实际参数)

形式参数:定义函数时的参数 形参

实际参数:函数调用传入的参数 实参

​ 实参:是一个表达式,指定实参时,不需要它的数据类型,实参的个数要和形参的个数统一

​ 例如调用exchange: exchange(a, b);

​ 参数的传递是一个 值传递(右值)

​ c语言中的函数的参数传递只有一种情况:值传递 就是把实参的值 传递给相应的形参

​ 2):函数调用表达式

​ 函数名(实参值列表) --》函数调用表达式

​ 函数调用表达式的值,就是这个函数执行完 return 后(return 0)的值, 函数的返回值

​ 3):函数调用过程

​ exchange(a,b) —> 调用的过程是如何发生的

​ 首先把实参的值一一传递给相应的形参,然后再跳转到函数里面去执行,直到遇到return 或者

​ 函数结束,再返回函数调用处

​ a.先给形参分配空间,再给形参赋值

​ b. 函数结束

​ return : 表示函数结束

​ 执行完所有语句:表示函数结束

​ return 后面的表达式的值就作为整个函数的返回值

5. 函数的声明

我发现如果函数放在main函数前面,就能够正常使用。但是放在后面就会出现编译错误。

在这里插入图片描述

​ 后面才知道,如果函数在main函数之后,就需要先声明函数。也就是加上定义函数时候的那个头部分

#include<stdio.h>
int  s_max(int x,int y,int z);              //如果不加这个声明编译器就会报错
int main()
{
	int m,n,k;
	printf("输入三个整数\n");
	scanf("%d %d %d",&m,&n,&k);
	printf("最大值为:%d\n",s_max(m,n,k));
	return 0;
}
int  s_max(int x,int y,int z)
{
  if(y>x)
  x=y;
  if(z>x)
  x=z;
    return x;
}






小练习:1.写一个函数判断一个一维数组是否为递增

#include<stdio.h>
void judge(int a[],int x);
int main()
{
	int n,i,j;
	printf("请输入数组元素个数\n");
	scanf("%d",&n);
	int a[n];
	for(i=0;i<n;i++)
	{
	printf("请输入第%d个\n",i+1);
	scanf("%d",&a[i]);
	}
	judge(a,n);
	return 0;
}
void judge(int a[],int x)
	{
	int i;
	for(i=1;i<x;i++)
	{
		if(a[i-1]>=a[i])
		{
			printf("该数组不是递增数组\n");
			return;
		}
	}
	printf("该数组是递增数组\n");
	return;
}

2.写一个函数,求一个整数的二进制中有多少个bit为1

#include<stdio.h>
int bit_1(int x);
int main()
{
	int n;
	printf("请输入一个整数\n");
	scanf("%d",&n);
	printf("%d二进制有%d个比特位为1\n",n,bit_1(n));
	return 0;
}
int bit_1(int x)
{   int i,flag=0;
	for(i=0;i<32;i++)
	{
		if((x&1)==1)
		{
		flag++;}
		x=x>>1;
	}
	return flag; 
}
6.发现的问题
  1. 定义函数的时候 void s_max(int x,int y);

这个void表明函数没有返回值。函数里面可以加return ;但是return 后面不能写东西。我开始把这个和任何类型的指针void * 搞混淆了,以为是返回值的类型是任意类型。

  1. 把数组a[n]传给函数的时候只需要传数组名和数组元素个数

就比如上面判断数组是否递增。调用函数应该是judge(a,n), 刚开始我用的judge(a[n],n)编译器报错。用judge(a[0],n)编译器也报错。后面发现是judge(a,n),将数组的名字,也就是数组首地址传了过去。judge(&a[0],n)也行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值