#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));
}