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 库函数:
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 拆分工作:
在这里插入代码片