不理解C中的指针

时间:2014-07-10 22:38:45

标签: c pointers

我显然误解了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;
}

2 个答案:

答案 0 :(得分:2)

larger_of中,您应该这些两行:

double *ptr1 = i;
double *ptr2 = j;

请注意删除&符号(&#39;&amp;&#39;)。在那里使用&符应该是错误的,因为您将ptr1ptr2设置为ij地址,所以{{ 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)

您的代码中的其他内容似乎是正确的。