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;
由于inti=5;和inti;i=5;给出相同的结果,因此其中一些人可能也会想到int*p=&i;并int*p;*p=&i;给出相同的结果。事实是,否,int*p;*p=&i;将尝试引用未初始化的指针,这将导致UB。*不声明或取消引用指针时,切勿使用。
结论
星号(*)在C中与指针有关有两种不同的含义,具体取决于使用的位置。当一个内使用的变量声明,在等号侧的右手侧的值应该是一个指针值到一个地址在存储器中。当与已经声明的变量一起使用时,星号将取消引用指针值,将其跟随到内存中的指向位置,并允许分配或检索存储在其中的值。
带走
可以这么说,在处理指针时,一定要注意您的P和Q。请注意何时使用星号,以及在星号上使用星号的含义。忽略此微小的细节可能会导致错误和/或不确定的行为,而您实际上并不想处理这些行为。