为什么 Dereference 运算符用于声明指针?

Why is the Dereference operator used to declare pointers?

为什么*用来声明指针?

它删除了间接寻址,但是当你声明一个像int *a = &b这样的指针时不删除任​​何间接寻址,它不应该删除&b的间接寻址吗?

任何时候你有一个像这样初始化的指针声明:

type *x = expr;

相当于先单独初始化再赋值:

type *x;
x = expr;

等同于

type *x;
*x = expr;      /* WRONG */

C 和 C++ 中的许多符号被重载。也就是说,它们的含义取决于使用它们的上下文。例如,符号 & 可以表示寻址运算符和二进制按位与运算符。

声明中使用的符号*表示一个指针:

int b = 10;
int *a = &b,

但用在表达式中,当应用于指针类型的变量时,表示解引用运算符,例如:

printf( "%d\n", *a );

也可以表示乘法运算符,比如可以这样写:

printf( "%d\n", b ** a );

相同
printf( "%d\n", b * *a );

同样,一对方括号可以用在数组的声明中,如:

int a[10];

并作为下标运算符:

a[5] = 5;

它是声明的一部分,所以它根本不是解引用运算符。但它仍然意味着同样的事情。

int *a

可以读作

The value pointed by a is an int.

就像

printf("%d\n", *a);

可以读作

Print the value pointed by a.

请参阅 this answer在 C/C++ 中声明指针变量的正确方法,了解一些背景知识。

当 C 被发明时,做出了一个有点有趣的选择。变量将以一种对它们将如何使用的回声来声明。

所以

int a;

的意思是“你可以从a中得到一个int。然后,

int *a;

意味着你可以从 *a 中得到一个 int

而且,

int a[3];

意味着你可以从a[index]中得到一个int;在这里,大小放在索引所在的位置。

这可以链接到复杂的案例

int *a[3];

int (*a)[3];

现在,如果您不知道 C 语言的解析是如何工作的,那么这是不透明的;但至少你只需要学习一次!

这就是为什么有些人认为 int* a 是错误形式的原因,因为 * 确实附加到 a 而不是 int

命名变量的初始化是另一回事。

(some declaration) = (some expression)

声明中的符号从不充当表达式。它们是相同的符号,只是含义不同。