1、不能在[]给定大小; 2、不要在被调用函数里使用sizeof(a)/sizeof(a[0])形式传递数组大小,直接给出数组长度,或者在 主调函数中使用sizeof(a)/sizeof(a[0])传递长度;
#include<stdio.h>
#define N 15
void halfSearch(int array[], int length, int number);
int main(void){
int array[N];
// 从大到小给数组赋初值
int i;
for(i = 0; i < N; i++){
array[i] = N - i; // 从大到小排列 15, 14, 13, 12,.......3, 2, 1
}
// 打印数组
for(i = 0; i < N; i++){
printf("%4d", array[i]);
}
printf("\n");
// 输入要查找的数
printf("Input a searchNumber:");
int searchNumber;
scanf("%d", &searchNumber);
// 调用折半查找函数, 这里特别要注意需要传入一个length,因为在函数中传入的只是数组的地址,不能用sizeof算出数组的长度
int length = sizeof(array) / sizeof(array[0]);
halfSearch(array, length, searchNumber); // 折半查找函数
return 0;
}
void halfSearch(int array[], int length, int number){
/*
在函数中使用sizeof(array)/sizeof(array[0])计算数组的长度是错误的,应为函数中传入的只是一个地址,
需要在函数的参数中添加一项数组长度;
*/
printf("sizeof(array)/sizeof(array[0]) = %d\n\n\n", sizeof(array)/sizeof(array[0]));
printf("数组长度length = %d\n", length);
int low = 0, high = N-1;
while(low <= high){
int mid = (low + high) / 2;
if(array[mid] > number){
low = mid + 1; // 这是因为数组是倒叙的形式
} else if(array[mid] == number){
printf("%d在数组中的第%d个位置!", number, mid+1);
break;
}else{
high = mid - 1; // 这是因为数组是倒叙的形式
}
}
if(low > high){
printf("数组中无此数!\n");
}
}
实验截图验证:
|