相同的星号不同的含义
前提
围绕 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. 请注意你何时使用星号,以及在使用星号时的含义。忽略这个微小的细节可能会导致你真正不想要处理的错误和/或未定义的行为。