#include <stdio.h>
void MaxAndMin(int* arr, int** max, int** min)
{
int i;
**max = **min = arr[0];
for (i = 1; i < 5; i++)
{
if (**max < arr[i])
{
**max = arr[i];
}
else
continue;
}
for (i = 1; i < 5; i++)
{
if (**min > arr[i])
{
**min = arr[i];
}
else
continue;
}
}
int main(void)
{
int* maxPtr;
int* minPtr;
int arr[5];
int i;
for (i = 0; i < 5; i++)
{
printf("입력:");
scanf("%d", &arr[i]);
printf("\n");
}
MaxAndMin(arr, &maxPtr, &minPtr);
printf("%d %d", *maxPtr, *minPtr);
}
这是指针的问题。我想打印出 arr 的最小值和最大值,但我不能。结果只是输入arr值就结束了,那么问题出在哪里呢?如果设置指针变量有任何问题请告诉我
您似乎误解了有关在 C 中模拟通过引用传递的内容。
指针
maxPtr
和minPtr
未初始化,它们指向不确定位置。在 MaxAndMin
函数中取消引用它们会导致 未定义的行为,并且可能会因分配而崩溃。
您应该将
max
和 min
声明为普通 int
变量,然后将指针传递给它们:
int max = 0;
int min = 0;
MaxAndMin(arr, &max, &min);
printf("%d %d", max, min);
并更新函数以对应于该更改:
void MaxAndMin(int *arr, int *max, int *min)
{
*max = *min = arr[0];
// ... etc...
}
这就是所谓的“随机添加
&
和 *
,直到看起来有效”,或者“多个 *
看起来很可疑”,我们都曾经历过这样的情况。 ;-)
int* maxPtr;
这是一个int 指针。
MaxAndMin(arr, &maxPtr, &minPtr);
这会将 int 指针的地址传递给函数。
void MaxAndMin(int *arr, int** max, int** min)
函数采用 int 指针的地址作为参数。
**max = **min = arr[0];
这里变得棘手:
max
是指向int的指针的地址。因此,*max
是指向int的指针,**max
是指向的int。
但是这里有一个问题。
*max
,推而广之,maxPtr
中的main()
,从未被要求指向任何东西。将 int
值[1] 写入 maxPtr
恰好指向的不确定地址是未定义行为。
你想要的是
max
,并且通过扩展,maxPtr
中的main()
,点到arr[0]
的地址:
*max = *min = &arr[0];
struct { int * min; int * max; } min_max_t;
,并将其用作
MaxAndMin()
的返回值:
// Untested
struct
{
int * min;
int * max;
} min_max_t;
struct min_max_t MinAndMax( int * arr )
{
struct min_max_t rc;
rc.min = rc.max = &arr[0];
// ...work with rc.min and rc.max
return rc;
}
int main(void)
{
int arr[5];
for ( int i = 0; i < 5; ++i )
{
printf( "입력:" );
if ( scanf( "%d", &arr[i] ) != 1 )
{
puts( "Non-numeric value entered!" );
return EXIT_FAILURE;
}
printf( "\n" );
}
struct min_max_t rc = MaxAndMin( arr );
printf( "%d %d", *rc.max, *rc.min );
}
arr[0]
,它可能已经或可能没有被你的
scanf()
初始化——你不知道,因为你没有检查
scanf()
的返回值...