我在做基础测试题的时候遇到过这么一个编程题。
设计一个函数,找出整型数组元素的最小值(C语言编程题)
我当时是那么分析的,单独设计一个函数来实现找出给定数组的最小元素,然后再返回这个数。在main函数中调用该函数,然后再打印出来。
首先,函数需要一个参数,当然传个数组给它就可以了。
然后,既然要找出数组中最小的元素,那一定要遍历数组 了。问题是怎么遍历呢?得知道数组的大小吧,可是函数定义时不 可能传给它一个固定大小的数组吧,那它的功能也太受限了吧。想 了许久,终于找到一个合适的方法来表示数组的大小,我用的是 sizeof(a)/sizeof(a[0]),这样就得到了数组的大小了,感觉也挺 通用的。主要问题解决了,然后就开始写代码了。我开始是这么写 的
#include<stdio.h>
int main()
{
int a[10] = {10,2,3,4,5,6,7,8,9,1};
printf("%d\n",min_element(a));
return 0;
}
int min_element(int a[])
{
int i,k;
k = a[0];
for(i=1 ; i<sizeof(a)/sizeof(a[0]) ; i++)
{
if(k > a[i])
k = a[i];
}
return k;
}
写完后,检查了一下代码,感觉逻辑上是对的,应该没什么问题了。于是开始编译运行,编译的时候没问题,可是一运行,结果是10.显然不是我想要的结果。想了半天也不知道问题出在那里,感觉没错啊,可结果为什么会这样?原来是我基础太差,把一个重要的知识点给忽略了。
那就是当数组名作参数时,在函数中会退化成指针。所以在min_element函数中,sizeof(a)的值不是数组所占的内存,而是指向这个数组的指针所占的内存。所以sizeof(a)/sizeof(a[0])的值是1,for循环里面的语句一次都没执行,最后打印出来的当然就是a[0]了。
问题是找到了,可是这个问题怎么解决呢?我一直没找到方法,最后我只能放弃在一个独立的函数中实现这功能,而直接在main函数中实现了。然后我就把下面代码交上去了。
#include<stdio.h>
int main()
{
int i,k;
int a[10] = {10,2,3,4,5,6,7,8,9,1};
k = a[0];
for(i=1 ; i<sizeof(a)/sizeof(a[0]) ; i++)
{
if(k > a[i])
k = a[i];
}
printf("the min of array is %d\n",k);
return 0;
}
显然这不是我想要的结果。不知道有没有什么好的解决方法。 |