不理解C中的指针

不理解C中的指针,c,pointers,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("Pl

我显然误解了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;
}
在大图中,您应该有以下两行:

double *ptr1 = i;
double *ptr2 = j;
请注意删除了符号“&”。在那里使用符号和应该是错误的,因为此时您将ptr1和ptr2设置为i和j的地址,因此ptr1和ptr2应该是双**s,而它们不是

此外,您需要检查*i>*j,而不是i>j,因为您要比较指针指向的值,而不是指针本身。i>j比较指针指向的地址

但是,您可以将其转换为以下内容,使其更大、更简洁:

void larger_of(double *i, double *j)
{
    if (*i > *j)
        *j = *i;
    else
        *i = *j;
}

因此,如果i指向的值大于j指向的值,那么将j指向的值设置为i指向的值。对else执行相反的操作。

对于声明为

double * d;
d包含包含双精度值的对象的地址*d包含双精度值,&d是指针对象d的地址

现在,在你的功能中

double *ptr1 = &i;
这是不对的。您需要的是double*ptr1=i。这将把i指向的对象的地址放入ptr1,您可以将该对象解引用为*ptr1或*i。在比较中,您需要将取消引用的对象作为*i>*j进行比较


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

如果i>j比较指针,而不是指针对象。你想要if*i>*j{*j=*i;}或者{*i=*j;}那么你是说它正在比较实际的地址吗?我是否需要最后一位中的两个ptr1和ptr2变量?我做错了,这不是一个有用的错误描述。当发布关于代码中错误的问题时,请描述哪些地方出现了明显的错误,以及应该发生什么。也有帮助。您应该会得到一个行double*ptr1=&i;的编译错误不要忽略这一点,因为您既没有解释代码应该做什么,也没有解释导致您在此处寻求帮助的问题。如果您需要这里的帮助,请解释您正在尝试做什么,发布尝试这样做的代码,并解释您在使用该代码时遇到的问题,并提出一个特定的问题。但我如何成为指针?是因为我调用了带有较大的_of&I,&j或什么的函数吗?@user3813418:你写了双*I。很明显,我是一个指针。@user3813418这就是为什么。是的,好吧,谢谢你处理我的愚蠢。指针一再让我放弃C,但这次我下定决心了。@MooingDuck我一定很累了,因为我不知道这是怎么回事。你能解释一下吗?@MooingDuck:我同意Jashaszun的观点,他正确地实现了规范。您正在将某个内容读入一条注释,但该注释不在规范中,老实说,也不在注释中。@BenVoigt:在重新阅读操作代码后,我意识到Jashaszun的代码与此相同,因此我收回我的投诉。我错了。