C语言 基础二 - 函数<1>

C语言 基础二

笔记来源于b站
更博只是为了记录笔记…无盗用之意

一.函数:

1.1 第一个Add( )函数:

#include <stdio.h>

//定义一个函数
int Add(int x,int y)//int Add 是因为,返回的z值为整型...
{
  int z =0;
  z = x + y;

  return z;//Add函数要返回值 为int整数型
}

int main()
{
	int a =10;
	int b =20;
	
	int sum = Add(a,b);//
	printf("%d\n",sum);
return 0;
}

1.2 函数的分类:

1.库函数 、2.自定义函数…

1.2.1 库函数:

cplus
cppreference

1.2.1.1 strcpy ( ) …字符串拷贝库函数;

在这里插入图片描述

    #include <string.h>

	char ar1[] = "bit";
	char ar2[10] ={0};

	strcpy(ar2,ar1);//使用库函数
    printf("%s\n",ar2);

strcpy 这个库函数 连 “\0”一起拷贝…
在这里插入图片描述

1.2.1.2 memset ( )… 内存设置:

在这里插入图片描述
在这里插入图片描述

	char ar1[] = "hello world";
	memset(ar1,'*',5);
	
	//这个不修改 带入'\0'...所以是 ‘***** world’
	printf("%s\n",ar1);
1.2.2 自定义函数:

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/73cb0837e9834187afbedb5f32b80a3d.png?x-oss-p rocess=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMWV5dW5fYw==,size_20,color_FFFFFF,t_70,g_se,x_16)

1.2.2.1 getmax ( ):

在这里插入图片描述

int getmax(int x,int y)
{
	 if(x>y)
	 {
		 return x;
	 }
	 else
		 return y;
}


int main()
{
	int a = 10;
	int b = 20;
	int max = getmax(a,b);
	printf("%d\n",max);
return 0;
}


1.2.2.2 Swap ( )…交换两个值的函数:
1.测试:

void定义 函数 不返回值…

void swap(int x ,int y)//void 表示不返回值...
{
	int tmp = 0;//中间变量

	tmp = x;
	x = y ;
	y = tmp;
}
	int a =10;
	int b =20;

	printf("%d,%d\n",a,b);
	swap(a,b);//交换函数...
	printf("%d,%d\n",a,b);

在这里插入图片描述

2.调试:

F10 是 调试的 往下一步执行…
F11 是 进函数 往下一步执行…

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.分析 & 解决:

分析:因为 a、b、x、y 地址根本不一样…所以调用swap ( ) 这样的函数…起不到作用…
解决:(记得之前有这么样的一个操作…)

	int a =10;
	int* pa = &a;//指针变量...存地址...

	*pa = 100;//解引用操作符‘*’
    printf("%d\n",a);
1.2.2.3 Swap2 (int* pa , int* pb):
void swap(int* pa,int* pd)//void 表示不返回值...
{
	int tmp = 0;//中间变量

	tmp = *pa;//解引用操作...
	*pa = *pd;
	*pd = tmp;
   
}
	int a =10;
	int b =20;

	printf("%d,%d\n",a,b);
	swap(&a,&b);//交换函数..."取地址操作"...
	printf("%d,%d\n",a,b);
1.2.2.4 函数的参数:
1.形参和实参:

形参 是 实参 的一份临时拷贝…对形参的修改是不会改变实参的…
在这里插入图片描述

2.传值调用 / 传址调用:

1.传值调用:
函数的 形参 和 实参 分别占用不同的内存块,对行参的修改不会影响实参…

2.传址调用:
可以把 函数 和 函数外边 的变量建立起真正的联系…即函数内部可以操作函数外部的变量…

1.2.2.5 练习:
1.2.2.5.1 判断一个数是不是素数:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int is_prime(int n)
{
	//2 - n-1 中 能
	int j =0;

	for(j=2;j<n;j++)
	{
	   if(n%j == 0)//就是2 - n-1中有可以被除的...
		   return 0;
	}

	return 1;//素数..
}

int main()
{

	int i=0;
	for(i=100;i<=200;i++)//100-200,之内的素数...
	{
	  if(is_prime(i) == 1)
		 printf("%d\n",i);
	}

    return 0;
}
1.2.2.5.2 判断闰年:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int is_leap_year(int y)
{//闰年整除4 同时整除100  或者 整除400
  if((y%4 ==0 && y%100!=0) || (y%400 ==0))
     return 1;
  else
     return 0;
}

int main()
{
	int year = 0;
	for(year =1000;year<=2000;year++)
	{
	if(is_leap_year(year) == 1)
	{
		printf("leap year:%d\n",year);
	}
	}
	return 0;
}
1.2.2.5.3 写一个有序数组的二分查找:

函数传数组…只是传了一个地址…

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

int binary_serach(int arr1[],int k,int sz)
{
	//算法的实现
	
	int right = sz-1;
	int left = 0;

	
	while(left<=right)
	{
	int mid = (left+right)/2;//中间元素的下标
	 if(arr1[mid]<k)
	   left =mid+1;
	else if(arr1[mid]<k)
	   right = mid-1;
	else
	   return mid;
	}
	return -1;//实在找不到...
}
	int arr[] ={1,2,3,4,5,6,7,8,9,10};
	int k =7;
	int sz = sizeof(arr)/sizeof(arr[0]);
	int ret = binary_serach(arr,k,sz);//函数返回 下标 或者 -1
	if(ret == -1)
	 {
	  printf("找不到指定的数字");
	 }
	else
	{
	printf("找到了,下标是:%d\n",ret);
	}

1.2.2.5.4 每调用一次函数 num+1:
void Add(int* p)
{
  (*p)++;
}

	 int num =0;
     Add(&num);
	 printf("%d\n",num);

	 Add(&num);
	 printf("%d\n",num);

	 Add(&num);
	 printf("%d\n",num);

1.3 函数的嵌套调用和链式访问:

1.3.1 嵌套调用:
void new_line()
{
  printf("%s\n",'hehe');
}



void new_three_line(int i)
{
	for(i=1;i<=3;i++)
	{
	new_line();
	}
}
1.3.2 链式访问:

把一个函数的返回值 作为另一个函数的参数

test1:
在这里插入图片描述
test2:
在这里插入图片描述
printf 的返回值 是 printf打印的个数…
在这里插入图片描述

1.4 函数声明 和 宏文件的作用

1.4.1 test.c :

test.c ( main.c) 里面直接写这样的调用 子函数 add()…但是呢,一般不这样去写…
在这里插入图片描述

1.4.2 add.c (源文件) / add.h ( 宏文件 ) :

一般这么写:

1.一般要把 要调用的 子函数 放在另一个源文件add.c里面…

2.一般要把 要调用的 子函数 的 函数声明 放在头文件add.h里声明…

在这里插入图片描述
—————————————————————————————————
在这里插入图片描述

//函数声明
int Add(int x,int y);

—————————————————————————————————
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1



int Add(int x,int y)

{
   int z =0;
   z = x + y;

   return z;
}
1.4.3 #include “add.h” 进行调用:

必须这样子引用…
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


#include  "add.h"

int main()
{
	int a =10;
	int b= 20;

	int sum = 0;
	sum  = Add(a,b);

	printf("%d\n",sum);



	return 0;

1.4.4 拆分工作:

在这里插入图片描述
在这里插入图片描述

在这里插入代码片
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值