第三章 函数(2)

实际参数

实际参数(实参):真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,他们都必须有确定的值,以便把这些值传送给形参

形式参数(形参):形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完之后就自动销毁了。因此形式参数只在函数中有效

//a和b为形参
int getMax(int a ,int b) {
	if(a>b)
		return a;
	else
		return b;
}

int main() {
	//这里a和b为实参
	int a = 3;
	int b = 4;
	getMax(3, 4);
	return 0;
}

为什么改变形参的值不改变实参的值?

当实参传给形参的时候,形参其实是实参的一份临时拷贝。当函数结束之后,这些临时拷贝便会被销毁。对形参的修改时不会改变实参的

函数调用两种方法:

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

练习:

【例题】写一个函数判断一个数是不是为素数

#include <math.h>
int isPrime(int n) {
	for(int i = 2;i <= sqrt(n);i++) {
		if(n%i==0)
			return 0;
	}
	return 1;
}
int main() {
	for(int i = 101;i <= 200;i+=2) {
		if(isPrime(i))
			printf("%d\\n", i);
	}
	return 0;
}

【例题】用函数实现二分查找

int binarySearch(int n[], int key) {
	int size = 0;
	int p = 0;
	while (n[p] != NULL) {
		p++;
		size++;
	}
	int left = 0;
	int right = size - 1;
	while (left <= right) {
		int middle = (left + right) / 2;
		if (n[middle] > key) {
			right = middle - 1;
		}
		else if (n[middle] < key) {
			left = middle + 1;
		}
		else if (n[middle] == key) {
			return middle;
		}
	}
	return -1;
}

int main() {
	int arr[5] = { 1,2,3,4,5};
	int k = binarySearch(arr, 5);
	printf("%d\\n", k);
	return 0;
}