今天帮同学想用C实现数组的折半查找,本来算法挺简单的,可是折腾了好几个小时才发现问题在哪,这个sizeof坑人不浅啊。

 1 #include<stdio.h>
 2 void m(int []);
 3 int main(){
 4     int a[9]={1,2,3,4,5,6,7,8,9};
 5     printf("%d\n",sizeof(a));
 6     m(a);
 7     
 8     return 0;
 9 }
10 
11 void m(int k[]){
12     printf("%d\n",sizeof(k));
13 
14 }

上面第5行的结果是36,第12行的结果是4,为啥同一个数组怎么结果不一样呢?原因就是发生在sizeof这里。那是因为sizeof是一个操作符,误认为是一个函数,还有就是数组在传递的过程中已经失去其原有的本义,在m函数中其实际上是传递的一个数组指针,所以第12行实际上是测试的指针的大小。

明白这里了,附上一篇C实现折半的代码

 1 #include<stdio.h>
 2 int binearySearch(int[],int,int);
 3 int main(){
 4     int a[9]={1,2,3,4,5,6,7,8,9};
 5     int m=5;
 6     int length=sizeof(a)/sizeof(int);
 7     int s=binearySearch(a,length,m);
 8     if(s==0)
 9         printf("找不到!\n");
10     else
11     printf("%d\n",s);
12     return 0; 
13 }
14 
15 int binearySearch(int m[],int N,int k){
16 int start,end,middle;
17     start=0;
18     end=N;       
19     while(start<end){
20         middle=(start+end)/2;
21         if(m[middle]==k){
22             return middle+1;
23         }
24         else if(m[middle]>k){
25             end=middle;
26         }
27         else if(m[middle]<k){
28             start=middle;
29         }
30     }
31     return 0;
32 }
上面结果是5.