通过引用传递时查找数组的最小值
Finding the Minimum of Array while passing by reference
我正在尝试使用 pass by reference 编写一个 void Function ,它找到一个数组的最小值,同时只给出一个指针数组的长度和数组的长度作为函数的参数。
我不断收到如下错误:
Incomplete type is not allowed (in the main function)
assignment to 'int *' from 'int' makes pointer from integer without a cast.
这是我的代码:
void minimum(int *iArray[], int count)
{
int min = iArray[0];
for(int i = 1; i < count; i++)
{
if (min > iArray[i])
*iArray = min;
}
}
int main()
{
int numbers[] = {4, 6, 9, 5};
printf("%d", minimum(numbers, 4));
return 0;
}
你能帮我看看我怎样才能做得更好吗?
函数的声明和定义不正确。
在这个函数调用中
minimum(numbers, 4)
数组被隐式转换为指向类型 int *
的第一个元素的指针。但是对应的函数参数的类型int *[]
被编译器调整为int **
..
类型
例如这一行
int min = iArray[0];
int
类型的对象 min
由 int *
类型的指针初始化。
此外,在找到最小元素的函数中更改源数组也是一个坏主意。
并且由于函数具有 return 类型 void
那么函数 printf
的调用是无效的
printf("%d", minimum(numbers, 4));
该函数应按以下方式声明和定义
int * minimum( const int *a, size_t n )
{
const int *min = a;
for ( size_t i = 1; i < n; i++ )
{
if ( a[i] < *min ) min = a + i;
}
return ( int * )min;
}
并且函数的调用看起来像
int *min = minimum(numbers, 4);
printf( "The minimum value is %d at position %tu.\n", *min, min - numbers );
或者,函数可以按以下方式声明和定义
size_t minimum( const int *a, size_t n )
{
size_t min = a;
for ( size_t i = 1; i < n; i++ )
{
if ( a[i] < a[min] ) min = i;
}
return min;
}
并且函数的调用看起来像
size_t min = minimum(numbers, 4);
printf( "The minimum value is %d at position %zu.\n", numbers[min], min );
numbers
是指向数组第一个元素的指针。因此你的函数定义应该是这样的:-
int minimum(int *iArray, int count)
或
int minimum(int iArray[], int count)
注意:您寻找最小值的逻辑有一些错误,您应该 return min
以便用 printf
打印它。您的完整代码将如下所示:-
#include <stdio.h>
int minimum(int *iArray, int count)
{
int min = iArray[0];
for(int i = 1; i < count; i++)
{
if (min > iArray[i])
min = iArray[i];
}
return min;
}
int main()
{
int numbers[] = {4, 6, 9, 5};
printf("%d", minimum(numbers, 4));
return 0;
}
我正在尝试使用 pass by reference 编写一个 void Function ,它找到一个数组的最小值,同时只给出一个指针数组的长度和数组的长度作为函数的参数。
我不断收到如下错误:
Incomplete type is not allowed (in the main function) assignment to 'int *' from 'int' makes pointer from integer without a cast.
这是我的代码:
void minimum(int *iArray[], int count)
{
int min = iArray[0];
for(int i = 1; i < count; i++)
{
if (min > iArray[i])
*iArray = min;
}
}
int main()
{
int numbers[] = {4, 6, 9, 5};
printf("%d", minimum(numbers, 4));
return 0;
}
你能帮我看看我怎样才能做得更好吗?
函数的声明和定义不正确。
在这个函数调用中
minimum(numbers, 4)
数组被隐式转换为指向类型 int *
的第一个元素的指针。但是对应的函数参数的类型int *[]
被编译器调整为int **
..
例如这一行
int min = iArray[0];
int
类型的对象 min
由 int *
类型的指针初始化。
此外,在找到最小元素的函数中更改源数组也是一个坏主意。
并且由于函数具有 return 类型 void
那么函数 printf
的调用是无效的
printf("%d", minimum(numbers, 4));
该函数应按以下方式声明和定义
int * minimum( const int *a, size_t n )
{
const int *min = a;
for ( size_t i = 1; i < n; i++ )
{
if ( a[i] < *min ) min = a + i;
}
return ( int * )min;
}
并且函数的调用看起来像
int *min = minimum(numbers, 4);
printf( "The minimum value is %d at position %tu.\n", *min, min - numbers );
或者,函数可以按以下方式声明和定义
size_t minimum( const int *a, size_t n )
{
size_t min = a;
for ( size_t i = 1; i < n; i++ )
{
if ( a[i] < a[min] ) min = i;
}
return min;
}
并且函数的调用看起来像
size_t min = minimum(numbers, 4);
printf( "The minimum value is %d at position %zu.\n", numbers[min], min );
numbers
是指向数组第一个元素的指针。因此你的函数定义应该是这样的:-
int minimum(int *iArray, int count)
或
int minimum(int iArray[], int count)
注意:您寻找最小值的逻辑有一些错误,您应该 return min
以便用 printf
打印它。您的完整代码将如下所示:-
#include <stdio.h>
int minimum(int *iArray, int count)
{
int min = iArray[0];
for(int i = 1; i < count; i++)
{
if (min > iArray[i])
min = iArray[i];
}
return min;
}
int main()
{
int numbers[] = {4, 6, 9, 5};
printf("%d", minimum(numbers, 4));
return 0;
}