C语言相同的星号,不同的含义

示例

前提

关于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。请注意何时使用星号,以及在星号上使用星号的含义。忽略此微小的细节可能会导致错误和/或不确定的行为,而您实际上并不想处理这些行为。