相同的星号不同的含义

前提

围绕 C 和 C++中指针语法最令人困惑的事情是,当指针符号星号(*)与变量一起使用时,实际上有两种不同的含义。

首先,使用* 声明一个指针变量。

int i = 5;
/* 'p' is a pointer to an integer, initialized as NULL */
int *p = NULL;
/* '&i' evaluates into address of 'i', which then assigned to 'p' */
p = &i;
/* 'p' is now holding the address of 'i' */

当你没有声明(或乘法)时,*用于取消引用指针变量:

*p = 123;
/* 'p' was pointing to 'i', so this changes value of 'i' to 123 */

如果希望现有指针变量保存其他变量的地址,则不要使用*,而是这样做:

p = &another_variable;

当 C 编程新手同时声明和初始化指针变量时,会出现常见的混淆。

int *p = &i;

由于 int i = 5;int i; i = 5; 给出相同的结果,他们中的一些人可能认为 int *p = &i;int *p; *p = &i; 也给出相同的结果。事实是,不,int *p; *p = &i; 会尝试推导一个未初始化的指针,这将导致 UB。当你没有声明或取消引用指针时,切勿使用*

结论

星号(*)在 C 中与指针有两个不同的含义,具体取决于它的使用位置。当一个内使用的变量声明,在等号侧的右手侧的值应该是一个指针值到一个地址在存储器中。当与已声明的变量一起使用时,星号将取消引用指针值,将其跟随到内存中的指向位置,并允许分配或检索存储在那里的值。

带走

在处理指针时,重要的是要记住你的 P 和 Q. 请注意你何时使用星号,以及在使用星号时的含义。忽略这个微小的细节可能会导致你真正不想要处理的错误和/或未定义的行为。