C语言(五)写二分查找时犯的错,有关数组元素个数计算位置的问题

在今天写顺序表中二分查找时,遇到了一些之前没注意的问题
该问题是关于计算数组元素个数(即数组长度)的方法和位置

问题代码:

#include <stdio.h>
#include <stdlib.h>

int BinaryFind(int arr[],  int v){
	int left = 0, mid = 0, right = 	sizeof(arr) / sizeof(arr[0]) - 1;		//问题出在这里
	while (left <= right){
		mid = (left + right) / 2;
		if (arr[mid] == v){
			return mid;
		}
		else if (arr[mid] > v){
			right = mid - 1;
		}
		else if (arr[mid] < v){
			left = mid + 1;
		}
	}
	return -1;
}

int main(){
	int arr[] = { 1, 4, 6, 7, 9, 10, 31, 34, 54 };
	printf("%d\n", BinaryFind(arr, 54));
	system("pause");
	return 0;
}

以下代码为修改后的代码:

#include <stdio.h>
#include <stdlib.h>

int BinaryFind(int arr[], int num, int v){
	int left = 0, mid = 0, right = num - 1;
	while (left <= right){
		mid = (left + right) / 2;
		if (arr[mid] == v){
			return mid;
		}
		else if (arr[mid] > v){
			right = mid - 1;
		}
		else if (arr[mid] < v){
			left = mid + 1;
		}
	}
	return -1;
}

int main(){
	int arr[] = { 1, 4, 6, 7, 9, 10, 31, 34, 54 };
	int num = sizeof(arr) / sizeof(arr[0]);		//获得数组长度,只能在数组定义所在的代码区中
	printf("%d\n", BinaryFind(arr, num, 54));
	system("pause");
	return 0;
}

总结问题所在: 在函数中,arr 是函数形参,只是一个指针(即地址,在函数运行时,不知道 arr 所表示的地址有多大的数据存储空间(形参是实参的拷贝,因此只是拷贝了地址,并不知道指针指向数据的大小和长度),这里只是告诉函数:一个数据存储空间的首地址),所以 sizeof(arr) 的结果是指针变量 arr 占内存的大小,一般在32位机上是4个字节。arr[0]是int类型,sizeof(arr[0])也是4个字节,所以,结果永远是1.
因此,获得数组长度,只能在数组定义所在的代码区中,采用以上方法,才可以达到预期的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值