为什么该程序不打印“ 4”?

sag*_*ino 3 c pointers postfix-operator

* ptrj ++执行后,ptrj值不应该为4吗?

int j=3,*ptrj = NULL;
ptrj = &j;
*ptrj++;
printf("%i",*ptrj);
Run Code Online (Sandbox Code Playgroud)

klu*_*utt 9

*ptrj++与相同*(ptrj++)。您所期望的是(*ptrj)++。您应该查找运算符优先级,以了解更多有关哪个运算符在其他运算符之前起作用的信息。要了解其ptrj++作用,您应该阅读有关指针算术的知识。但这是一个简单的解释:

  • *(ptrj++)返回ptrj指向(3)的值,然后THEN递增ptrj以指向下一个值。

  • (* ptrj)++返回ptrj指向(3)的,然后THEN 将ptrj指向3 的递增到4。

这意味着您要打印的是address &j + 1处的值,该值位于内存中变量之后j。这是未定义的行为。正如Sourav所指出的,如果启用了编译器警告,您将得到一条警告,指出您这一点。

*ptrj++和之间的唯一区别ptrj++是返回的内容。并且由于您不使用返回值,因此您的代码等效于:

int j=3,*ptrj = NULL;
ptrj = &j;
ptrj++;
printf("%i",*ptrj);
Run Code Online (Sandbox Code Playgroud)