C语言学习——6
一、函数
概念:具有特定功能的代码模块。
1.函数的一般形式
返回值 函数名(形式参数列表: 形参)
{
代码块;
return 返回值;
}
2.函数的调用
函数名(实参列表:实参);
练习
实现一个交换函数,交换两个变量的值。
/*===============================================
* 文件名称:eg1.c
* 创 建 者:
* 创建日期:2025年07月20日
* 描 述:
================================================*/
#include <stdio.h>
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(int argc, char *argv[])
{
int a = 11;
int b = 20;
swap(&a,&b);
printf("a = %d , b = %d\n",a,b);
return 0;
}
3.函数传参
(1)复制传递
被调用的函数的形参,不能访问实参。
void swap(int a,int b);
(2)地址传递方式
void swap(int *a,int *b);
(3)全局变量传参
int a = 10;
int func(int x);
void main()
{
func(a);
}
(4)一位数组传参
传的是数组的地址
void func(int a[6]);
void func(int a[]);
//最常用
void func(int *a);
练习
封装一个一维整型的数组的冒泡排序函数
/*===============================================
* 文件名称:eg2.c
* 创 建 者:青木莲华
* 创建日期:2025年07月20日
* 描 述:
================================================*/
#include <stdio.h>
/*
* 函数名 : Bob
* 参数:
* *p :数组首地址
* size :数组内元素个数
* 功能 :实现数组冒泡排序(升序)
* */
void Bob(int *p,int size)
{
int temp = 0;
for(int i = 0 ; i < size - 1 ; i++)
for(int j = 0 ; j < size - 1 - i ; j++)
if(p[j] > p[j+1])
{
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
/*
p[j] = p[j] ^ p[j+1];
p[j+1] = p[j] ^ p[j+1];
p[j] = p[j] ^ p[j+1];
*/
}
}
int main(int argc, char *argv[])
{
int a[8] = {13,55,44,32,2,7,9,15};
Bob(a,8);
for(int i = 0 ; i < 8 ; i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
(5)传参二维数组
void show(int a[][4],int h,int l);
void show(int (*p)[4],int h,int l);
void show(int *p,int num);
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
练习
找出二维数组中的最大值
/*===============================================
* 文件名称:eg3.c
* 创 建 者:青木莲华
* 创建日期:2025年07月20日
* 描 述:
================================================*/
#include <stdio.h>
int getMaxNum(int *p,int size)
{
int max = *p;
for(int i = 0 ; i < size ; i++)
if(max < p[i]) max = p[i];
return max;
}
void show(int *p,int size)
{
for(int i = 0 ; i < size ; i++)
printf("%d\t",p[i]);
puts("");
}
int main(int argc, char *argv[])
{
int a[3][4] = {1,33,44,5,2,66,71,8,9,10,111,12};
show(a[0],12);
int max = getMaxNum(a[0],12);
printf("Max : %d\n",max);
return 0;
}
取随机数
#include time.h
4.指针函数
指针函数:返回类型是一个指针的函数
注意:
1.指针函数不能返回局部变量的地址
2.可以实现链式编程
链式编程示例
char *strcpy(char *dest, const char *src);
put(strcpy(str,"xxxxxxxx"));
练习
仿照strcpy,实现封装自己的Mystrcpy
/*===============================================
* 文件名称:eg4.c
* 创 建 者:青木莲华
* 创建日期:2025年07月20日
* 描 述:
================================================*/
#include <stdio.h>
char *MyStrcpy(char *dest ,const char *src)
{
char *temp = dest;
while(*src != '\0')
{
*temp = *src;
temp++;
src++;
}
*temp = '\0';
return dest;
}
int main(int argc, char *argv[])
{
char str1[32] = "";
char str2[32] = "hello world!";
puts(MyStrcpy(str1,str2));
return 0;
}
5.函数指针
概念:是一个指针,指向一类函数的指针。
一般形式
返回值 (*函数指针名) (形参);
eg
int Add(int x,int y)
{
return x+y;
}
int (*funcp)(int x,int y);
funcp = Add;
funcp = &Add; //等价于 funcp = Add;
(1)利用函数指针调用函数:
函数指针名(实参);
funcp(10,20);
(*funcp)(10,20);
6.函数指针数组
概念:是一个数组,元素类型是指向函数的指针。
int (*func[2])(int x,int y);
int (*p[2])(int X,int y);
p[0] = Add;
p[1] = ⋐
printf("%d\n",p[0](10,20));
printf("%d\n",(*p[1])(10, 20) );
return 0;
7.main函数的参数
int main(int argc, char *argv[]);
int argc //命令行执行时所传进来参数的个数
char *argv[] //命令行传入参数的首地址