我显然误解了c中指针的用法。该书说编写一个程序,它将找到两个数字中最大的一个,并将这些变量的值更改为更大的值,我做错了。这是我的代码,有人可以帮忙吗?
/*finds the largest of two variables, replaces them with it*/
#include <stdio.h>
void larger_of(double *i, double *j);
int main(void) {
double i, j;
printf("Please enter two numbers.\n");
scanf("%lf %lf", &i, &j);
printf("i is %lf and j is %lf.\n", i, j);
larger_of(&i, &j);
printf("Now i is %lf and j is %lf.\n", i, j);
printf("DONE\n");
return 0;
}
void larger_of(double *i, double *j) {
double *ptr1 = &i;
double *ptr2 = &j;
if(i > j) {
*ptr1 = *i;
*ptr2 = *i;
} else {
*ptr1 = *j;
*ptr2 = *j;
}
return;
}
答案 0 :(得分:2)
在larger_of
中,您应该这些两行:
double *ptr1 = i;
double *ptr2 = j;
请注意删除&符号(&#39;&amp;&#39;)。在那里使用&符应该是错误的,因为您将ptr1
和ptr2
设置为i
和j
的地址,所以{{ 1}}和ptr1
应该是ptr2
s,它们不是。{/ p>
此外,您需要检查double**
,而不是*i > *j
,因为您想要通过指针比较指向的值,而不是指针本身( i > j
比较指针指向的地址。
但是,您可以通过将其变为以下内容来简化i > j
:
larger_of
因此,如果void larger_of(double *i, double *j)
{
if (*i > *j)
*j = *i;
else
*i = *j;
}
指向的值大于i
指向的值,则将j
指向的值设置为j
指向的值。对i
执行相反的操作。
答案 1 :(得分:1)
对于声明为
的变量double * d;
d
包含包含double
值的对象的地址; *d
包含double
值,&d
是指针对象d
的地址。
现在,在你的函数中,
double *ptr1 = &i;
不正确。你需要的是double * ptr1 = i
。这会将i
指向的对象地址放入ptr1
,您可以将对象取消引用为*ptr1
或*i
。在比较中,您需要将解除引用的对象比较为(*i > *j)
。
您的代码中的其他内容似乎是正确的。