可能实现函数实现二分查找,我们首先想到的是接下来这种代码:
//二分查找#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;}elseif(num[mid]<a){left=mid+1;}elsereturn 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;}elseif (num[mid] < a){left = mid + 1;}elsereturn 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中程序的规范要求!!!!!