在今天写顺序表中二分查找时,遇到了一些之前没注意的问题
该问题是关于计算数组元素个数(即数组长度)的方法和位置
问题代码:
#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.
因此,获得数组长度,只能在数组定义所在的代码区中,采用以上方法,才可以达到预期的效果。