C 指针,最小值和最大值
C pointers, minimum and maximum values
我需要编写一个获取 num1、num2 和 num3 作为参数的函数。函数完成后 运行,发送到主函数的参数(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 error C4700: 使用了未初始化的局部变量'num3'
请帮我修复程序!
谢谢你。 - 阿姆农。
你遇到的第一个问题就在这里
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);
没有任何用处
错误与问题
关于你的错误:
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);
我需要编写一个获取 num1、num2 和 num3 作为参数的函数。函数完成后 运行,发送到主函数的参数(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 error C4700: 使用了未初始化的局部变量'num3'
请帮我修复程序! 谢谢你。 - 阿姆农。
你遇到的第一个问题就在这里
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);
没有任何用处
错误与问题
关于你的错误:
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);