前言
本菜鸡开始了学习C语言的旅途。用这个来记录一下上课所学到的一些东西。仅作为自己的一个学习笔记。里面的内容也只是我对学到的东西的一些理解,可能有很多错误,大佬们勿喷。如果发现我理解的有哪些是错误的,欢迎评论区指出,希望大佬们不吝赐教。
函数
1.定义
函数:相同代码封装,重复利用
C语言指令必须在函数内部
函数可以实现代码复用,实现模块化的设计
结构化程序设计者主张把一个大任务分成多个功能函数来完成
2.如何设计一个函数
设计函数:
-
确定函数功能,要完成的目标,确定函数名
如:求一个数组的最大值
函数名 array_max
-
完成该目标需要什么数据,传入参数
如:求一个数组的最大值
参数 数组名int a[10],数组元素个数
-
算法实现
…
-
完成后返回结果,返回值
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.发现的问题
- 定义函数的时候 void s_max(int x,int y);
这个void表明函数没有返回值。函数里面可以加return ;但是return 后面不能写东西。我开始把这个和任何类型的指针void * 搞混淆了,以为是返回值的类型是任意类型。
- 把数组a[n]传给函数的时候只需要传数组名和数组元素个数
就比如上面判断数组是否递增。调用函数应该是judge(a,n), 刚开始我用的judge(a[n],n)编译器报错。用judge(a[0],n)编译器也报错。后面发现是judge(a,n),将数组的名字,也就是数组首地址传了过去。judge(&a[0],n)也行。