第三十五章:自定义函数

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void swap1(int x,int y){//传值调用。实参传给形参实际上是实参的一份临时拷贝对形参的修改不会影响实参。形参是被调用时开辟、分配内存,离开函数即销毁。
	int tmp = 0;
	tmp = x;
	x = y;
	y = tmp;
}
void swap2(int* pa, int* pb){//传址调用。给的是地址,函数内外可以建立真正的联系,函数内部可以真正操作函数外部的变量
	int tmp = 0;
	tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}
int main(){
	int a = 10;
	int b = 20;
	swap1(10, 20);//无法生效,因为调用的外部函数x,y和main都有自己独立的空间并不是互相影响
	printf("a=%d b=%d\n", a, b);
	swap2(&a, &b);//想要建立关系,那么不应该是操作值而是应该操作main函数内的地址
	printf("a=%d b=%d\n",a,b);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
如果定义这样一个函数

int swap(int [] arr,int y){
//实际传入的是arr[0]的地址,因此我们需要定义的时候应该多穿一个size,
//因为sizeof(arr)等价于sizeof(arr[0]),所以应该在main()求出size,然后放入定义的形参,
//即正确定义应该 int swap(int [] arr,int y,int size){}
//方法体
}

二分查找自定义函数

int binary_search(int arr[],int k,int sz){
	//算法实现
	int left=0;
	int right=sz-1;
	while(left<=right){
	int mid=(left+right)/2;
	if(arr[mid]<k){
		left=mid+1;
	}else if(arr[mid]>k){
		right=k-1;
	}else{
			return mid;
		}
}
return -1;
}
int main(){
//寻找有序数组具体数字和下标
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_search(arr,k,sz);
if(ret==1){
printf("找不到\n");
}else{
	printf("找到了,下标是%d\n",ret);
}	
}

使用指针类型形参需要注意的

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

void add(int* p){
	(*p)++;//这个必须加括号,不然优先计算p++ 再*
}
int main(){
	//寻找有序数组具体数字和下标
	int num = 0;
	add(&num);
	printf("num=%d\n",num);//1
	add(&num);
	printf("num=%d\n", num);//2
	add(&num);
	printf("num=%d\n", num);//3

}

真正的规范是在源文件目录创建add.c在add.c中写具体方法函数,创建头文件add.h在头文件add.h中进行声明,最后在原文件目录创建test.c中进行包含#include “add.h”
在这里插入图片描述

add.c文件

int add(int x,int y){
	
	return x+y;
}

add.h文件

#define  _CRT_SECURE_NO_WARNINGS
int add(int x,int y);

test.c文件

#include<stdio.h>
#include<string.h>
#include "add.h"//自定义的使用双引号
int main(){
	add(10, 20);
	printf("%d\n", add(10, 20));
}

add.h进行优化

#ifndef _ADD_H //if not define如果没有定义才会包含
#define _ADD_H //那么定义_ADD_H
#define  _CRT_SECURE_NO_WARNINGS
int add(int x,int y);//函数声明

#endif

test.c

#include<stdio.h>
#include<string.h>
#include "add.h"//包含一次会把add.h声明的函数全部拷贝过来,所以我们加入#ifndef进行判断,防止重复引用相同方法代码,防止编译器重复编译
int main(){
	add(10, 20);
	printf("%d\n", add(10, 20));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值