#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值,那么问题出在哪里呢?如果设置指针变量有什么问题,请告诉我
2条答案
按热度按时间anhgbhbe1#
你似乎误解了在C中模拟通过引用传递的一些东西。
指针
maxPtr
和minPtr
没有初始化,它们指向 * 不确定 * 的位置。在MaxAndMin
函数中取消引用它们,会导致 *undefined行为 *,并且可能会在赋值时崩溃。你应该将
max
和min
声明为普通的int
变量,然后传递指向它们的指针:字符串
并更新函数以对应于该更改:
型
s4n0splo2#
这被称为“随机添加
&
和*
,直到它看起来有效”,或者“多个*
看起来可疑”,我们都曾在一个点上遇到过。;-)字符串
这是一个指向int的指针。
型
这将 address of pointer-to-int 传递给函数。
型
函数以 address of pointer-to-int 作为参数。
型
这就有点棘手了:
max
是 * 指向int的指针的地址 。因此,*max
是 pointer-to-int,而**max
是所指向的 int。但你现在有个问题。
*max
,通过扩展,maxPtr
在main()
中, 从来没有指向任何东西 *。将int
值[1]写入maxPtr
恰好指向的不确定地址是undefined behavior。你想要的是
max
,通过扩展,main()
中的maxPtr
,以 * 指向 *arr[0]
* 的地址:型
一般来说,更改函数的参数是不好的风格。有时是必要的,但最好避免。函数的一个更简洁的设计是声明一个
struct { int * min; int * max; } min_max_t;
,并将其用作MaxAndMin()
的返回值:型
也就是说,实际上并不需要首先使用指针 *,因为您的函数目前 *。(你可能在以后的某个时候需要它们,或者作为一个学习练习来做,这两个都是有效的考虑因素,我只是说你可以在没有它们的情况下解决这个问题。
型
至于你的双循环,请注意,你可以在同一个循环中检查
max
和min
*,这更有效。你也可以在没有continue
的情况下这样做,它是break
稍微不那么邪恶的表亲:型
[1]
arr[0]
,它可能已经被你的scanf()
初始化了,也可能没有--你不知道,因为你没有检查scanf()
的返回值......