C指针,最小值和最大值

时间:2015-03-21 22:20:17

标签: c pointers max minimum

我需要编写一个将num1,num2和num3作为参数的函数。函数运行完毕后,发送到main函数的参数(num1,num2和num3)应该更改,以便num1包含最小值,num2包含第二大值,num3包含最大值。我还需要编写交换函数并使用它。 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
void SmallBig(int* num1, int* num2, int* num3);
void swap(int* x, int* y);
void main()
{
    int *num1, *num2, *num3;
    *num1 = 1;
    *num2 = 69;
    *num3 = 22;
    printf("%d %d %d\n", *num1, *num2, *num3);
    SmallBig(*num1, *num2, *num3);
    printf("%d %d %d\n", num1, num2, num3);
    system("PAUSE");

}
void SmallBig(int* num1, int* num2, int* num3)
{
    if (*num1 > *num3 && *num2 > *num3 && *num1 > *num2)
    {
        swap(num1, num3);
        swap(num2, num2);
        swap(num3, num1);
    }
}
void swap(int* x, int* y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

这些是我得到的错误:

Warning 1   warning C4047: 'function' : 'int *' differs in levels of indirection from 'int' 
Warning 2   warning C4024: 'SmallBig' : different types for formal and actual parameter 1   
Warning 3   warning C4024: 'SmallBig' : different types for formal and actual parameter 2   
Warning 4   warning C4024: 'SmallBig' : different types for formal and actual parameter 3   
Error   5   error C4700: uninitialized local variable 'num1' used   
Error   6   error C4700: uninitialized local variable 'num2' used   

错误7错误C4700:未初始化的本地变量'num3'使用

请帮我修复程序! 谢谢。 - Amnon。

2 个答案:

答案 0 :(得分:1)

你遇到的第一个问题是

SmallBig(*num1, *num2, *num3);

您将引用的指针作为参数传递 - 它们的类型int不是int*。您的SmallBig函数需要指针,因此请将其称为

SmallBig(num1, num2, num3);

您的代码至少现在应该使用此更改进行编译。

第二个主要问题是,当您执行此操作时,您正在为未初始化的内存写入值

int *num1, *num2, *num3;
*num1 = 1;
*num2 = 69;
*num3 = 22;

写入未初始化的内存是未定义的行为,最多会导致段错误。更安全的方法是

int num1,num2,num3;
num1 = 1;
num2 = 69;
num3 = 22;

然后将这些int变量的地址传递给期望int*个参数的函数。如果您不喜欢这种方式,则需要动态分配指针。你不能写一个未经证实的指针指向的东西而不会遇到麻烦。

最后,这一行

swap(num2, num2);

没有任何用处

答案 1 :(得分:1)

错误和问题

关于您的错误:

int *num1, *num2, *num3;  // you define 3 pointers to int but let them unitinialised !
*num1 = 1;                 // you write something to the poinded adress, which might be random !!
*num2 = 69;
*num3 = 22;

当您使用指针而不初始化它们时(您只初始化指向的值),您会收到此错误消息

然后你的第二个printf()打印指针而不是指向的值。

最后,SmallBig()仅适用于少数情况!

解决方案

main()中使用整数,而不是指针:

int num1, num2, num3;
num1 = 1;
num2 = 69;
num3 = 22;
printf("%d %d %d\n", num1, num2, num3);
SmallBig(&num1, &num2, &num3);   // use the address 
printf("%d %d %d\n", num1, num2, num3);

我差点忘了你的SmallBig()功能了!在那里,继续像你一样使用指针。但你必须预见更多的案例:

   if (*num1 > *num3) 
        swap (num1, num3); 
   if (*num1 > *num2) 
        swap (num1, num2); 
   if (*num2 > *num3) 
        swap(num2, num3);
相关问题