普通文字是指地址,而 *literal 是指地址的实际值吗?所以,之后:
int i = 0;
int *iPointer = &i;
以下表达式将查找 VALUE AT 内存地址 &i:
*iPointer
以下将简单地产生内存地址&i:
iPointer
我逐步验证了我的假设,但我想确定(你永远不会知道这些事情)。
我想我只是对 * 符号在声明和访问中的不同用途感到困惑。
是的,这完全正确。
另外,请注意,&
也可以根据上下文声明引用。
在声明中,*
声明一个指针类型。
当应用于指针(如*ptr
)时,它表示解引用运算符并返回指针指向的值。
请注意,它operator *
可以重载,因此您也可以将其应用于对象,而不仅仅是指针,并让它做任何您想做的事情。
声明模仿使用。
如果您有一个指向p
整数值的指针,您可以通过p
使用一元运算符取消引用来访问该整数值*
,如
x = *p;
表达式 的类型*p
是int
,所以 的声明p
是
int *p;
变量 的类型p
是“指向”的指针int
,或者int *
。然而,声明被写成表达式 *p
的类型是int
.
因此,任何时候想要访问 指向的整数值p
,都必须使用*p
. 如果您只关心 中包含的地址值p
,则只需使用p
. 例如,取消引用 NULL 指针会导致未定义的行为,因此您至少要在尝试取消引用之前检查指针值是否不是 NULL:
if (p != NULL)
x = *p;
在条件中,我们关心的是 中包含的值p
,因此我们不会取消引用它。在语句中,我们关心p
指向的值,因此我们在此处取消引用它。
注意声明
int* p, q;
是相同的
int *p;
int q;
仅p
将其声明为指针;q
被声明为常规int
。