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);
以下是我不明白的地方:
第一种情况,为了抵消引用运算符的作用,解引用运算符与x
和y
一起使用,所以为了或多或少地使用它们如果您没有通过引用传递它们,您将以相同的方式使用它们而不取消引用,您可以将它们与 *
一起使用。但是在第二种情况下, call_this
不是使用取消引用运算符调用的,该运算符抵消了它通过引用传递的事实;即它不被称为 (*call_this)(5.5, 7)
。
你为什么要使用 *
来抵消引用传递的影响,这样你就可以或多或少地使用这个东西,就像你通常在变量的情况下那样,而不是在变量的情况下功能?
既可以调用函数指针也可以调用函数:
void (*a)();
void (b)();
// Both valid
a();
b();
我不明白指针的使用方式存在明显差异。
以下代码摘自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);
以下是我不明白的地方:
第一种情况,为了抵消引用运算符的作用,解引用运算符与x
和y
一起使用,所以为了或多或少地使用它们如果您没有通过引用传递它们,您将以相同的方式使用它们而不取消引用,您可以将它们与 *
一起使用。但是在第二种情况下, call_this
不是使用取消引用运算符调用的,该运算符抵消了它通过引用传递的事实;即它不被称为 (*call_this)(5.5, 7)
。
你为什么要使用 *
来抵消引用传递的影响,这样你就可以或多或少地使用这个东西,就像你通常在变量的情况下那样,而不是在变量的情况下功能?
既可以调用函数指针也可以调用函数:
void (*a)();
void (b)();
// Both valid
a();
b();