写一个函数,实现一个整形有序数组的二分查找

#include <stdio.h>

int Binary(int arr[], int k)   //这里的arr本质上是个指针
{
	int sz = sizeof(arr) / sizeof(arr[0]); //由于上面的是指针,所以这里sz计算的是指针的大小,在win32系统下是4,而arr[0]是一个整形的大小,也是4,所以sz=4/4=1
	int left = 0;
	int right = sz - 1;

	while (left <= right)
	{
		int mid = left + (right - left) / 2; // 更新mid的值

		if (arr[mid] == k)
		{
			return mid; // 找到了元素,返回索引
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}

	return -1; // 找不到元素,返回-1
}

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int k = 7;
	int ret = Binary(arr, k);  //这里arr传递过去的是数组首元素的地址

	if (ret != -1)
	{
		printf("找到啦,下标是 %d\n", ret);
	}
	else
	{
		printf("找不到\n");
	}

	return 0;
}

上述代码由于在定义函数时是用指针去接收来自主函数里传递来的东西,所以导致在函数体中计算数组元素个数不靠谱,所以应该把计算数组元素个数拿到主函数里去计算。

修改后在给函数传递参数时,应该多加上一个数组元素个数(sz),如:

#include <stdio.h>

int Binary(int arr[], int k,int sz)  
{

	int left = 0;
	int right = sz - 1;

	while (left <= right)
	{
		int mid = left + (right - left) / 2; 

		if (arr[mid] == k)
		{
			return mid; 
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}

	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(arr, k,sz);

	if (ret != -1)
	{
		printf("找到啦,下标是 %d\n", ret);
	}
	else
	{
		printf("找不到\n");
	}

	return 0;
}

写一个函数,每调用一次这个函数,就会将num的值增加1

#include<stdio.h>

void Add(int* p)  //
{
	(*p)++;  //由于++的优先级比较高,如果写作*p++则代表只有p++,所以应该加括号
}

int main()
{
	int num = 0;
	Add(&num);
	printf("num = %d\n", num);//Add调用一次,num自加1,所以num的改变时在函数内部改变的,而想在函数内改变外面变量的值,需要用传址的方式
	Add(&num);
	printf("num = %d\n", num);
	Add(&num);
	printf("num = %d\n", num);
	return 0;
}

想在函数内改变外面变量的值,需要用传址的方式!