可能实现函数实现二分查找,我们首先想到的是接下来这种代码:
//二分查找 #include <stdio.h> #include <string.h> int cz_sz(int num[],int a) { int left,right,mid; left=0; right=sizeof(num)/sizeof(num[0])-1; mid=(left+right)/2; while(left<=right) { if(num[mid]>a) { right=mid+1; } else if(num[mid]<a) { left=mid+1; } else return mid; } if(left>right) return 0; } int main() { int left,right,mid; int a,t; int num[]={1,2,3,4,5,6,7,8,9,10}; printf ("请输入你要查找的值:"); scanf ("%d",&a); t=cz_sz(num,a); if(0==t) { printf ("没有找到\n"); } else { printf ("找到了,下标为:%d\n",t); } return 0; }
然后你会尴尬的发现:
当你输入了数组当中有的数字之后,他居然给我返回一个..........话不多说上图:
????这是怎么回事呢
原来啊,数组在传参的时候仅仅只是传参了首地址过去。、,所以才会导致计算长度的时候出现错误。
我们的解决办法是,把计算数组长度放在主函数里面,在主调函数中多增加一个参数,来解决问题。
朋友们我们一定要记住:形参其实只是实参的一份临时拷贝,对形参的改变不会改变实参值,只有通过传址调用建立联系才能对值进行更改(简而言之:使用指针!!!!)
我们将函数改为如下即可:
//二分查找 #include <stdio.h> #include <string.h> int cz_sz(int num[], int a, int b) { int left, right, mid; left = 0; right = b - 1; while (left <= right) { mid = (left + right) / 2; if (num[mid] > a) { right = mid + 1; } else if (num[mid] < a) { left = mid + 1; } else return mid; } return 0; } int main() { int a, t; int num[] = { 1,2,3,4,5,6,7,8,9,10 }; int b = sizeof(num) / sizeof(num[0]); printf("请输入你要查找的值:"); scanf_s("%d", &a); t = cz_sz(num,a,b); if (0 == t) { printf("没有找到\n"); } else { printf("找到了,下标为:%d\n", t); } }
现在执行就没有什么问题了,希望读者能够技术分享,有什么问题指出来,哈哈。然后,scanf_s函数是我在VS2019中程序的规范要求!!!!!