Referencing/dereferencing 在 C/C++

Referencing/dereferencing in C/C++

我不明白指针的使用方式存在明显差异。

以下代码摘自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)

你为什么要使用 * 来抵消引用传递的影响,这样你就可以或多或少地使用这个东西,就像你通常在变量的情况下那样,而不是在变量的情况下功能?

既可以调用函数指针也可以调用函数:

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

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