在C / C ++

时间:2016-03-19 19:24:41

标签: c reference dereference

指针的使用方式明显不一致,我不明白。

以下代码取自Pointers in C: when to use the ampersand and the asterisk?

void swap(int *x, int *y) {int tmp = *x; *x = *y; *y = tmp; }
...
int a = 1, b = 2;
printf("before swap: a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("after swap: a = %d, b = %d\n", a, b);

以下代码取自https://en.wikipedia.org/wiki/Typedef

int do_math(float arg1, int arg2) {
    return arg2;
}

int call_a_func(int (*call_this)(float, int)) {
    int output = call_this(5.5, 7);
    return output;
}

int final_result = call_a_func(&do_math);

这是我不明白的地方:

在第一种情况下,为了抵消引用运算符的影响,解除引用运算符与xy一起使用,因此为了使用它们或多或少相同如果你没有通过引用传递它们,你可以使用它们而无需解除引用,你可以将它们与*一起使用。但在第二种情况下,call_this不会使用解除引用操作符来调用,该操作符可以抵消它通过引用传递的事实;即它不被称为(*call_this)(5.5, 7)

为什么你会使用*来抵消通过引用传递的效果,这样你就可以像往常一样在变量的情况下使用这个东西,但不是在这种情况下功能?

1 个答案:

答案 0 :(得分:2)

您可以调用函数指针和函数:

void (*a)();
void (b)();

// Both valid
a();
b();