在*ptrj++执行之后,ptrj值不应该是4吗?
int j=3,*ptrj = NULL;
ptrj = &j;
*ptrj++;
printf("%i",*ptrj);发布于 2019-06-10 08:18:22
*ptrj++和*(ptrj++)是一样的。您所期望的是(*ptrj)++。您应该查找操作符优先级,以了解哪些运算符比其他操作符更早。要了解ptrj++的功能,您应该阅读指针算法。但这里有一个快速的解释:
*(ptrj++)返回ptrj指向(3)的值,然后递增ptrj以指向下一个值。(*ptrj)++返回ptrj指向(3)的值,然后将ptrj指向的值从3增加到4。这意味着您要打印的是地址&j + 1处的值,该值位于内存中变量j之后。这是未定义的行为。正如Sourav所指出的,如果启用编译器警告,您将得到一个指向此的警告。
*ptrj++和ptrj++之间唯一的区别在于它返回的内容。由于您不使用返回值,所以您的代码相当于:
int j=3,*ptrj = NULL;
ptrj = &j;
ptrj++;
printf("%i",*ptrj);发布于 2019-06-10 08:19:40
如果您在启用警告的情况下编译程序,您将看到
source_file.c:9:5: warning: value computed is not used [-Wunused-value]
*ptrj++;
^这意味着,价值计算是无用的。
换句话说,根据运算符优先 *ptrj++;与*(ptrj++);相同,并且根据增量后操作符属性,操作的值是操作数的值,值作为副作用增加。
引用C11,第一章
后缀
++操作符的结果是操作数的值。副作用是,操作数对象的值增加(也就是说,适当类型的值1被添加到它中)。……
所以,这和
*ptr;
ptr++;如果要在地址上增加该值,则需要使用显式括号强制执行运算符优先级,如
(*ptrj)++; // first get the value, then update the value.发布于 2019-06-10 08:22:35
*ptrj++相当于*(ptrj++)。
可以使用(*ptrj)++实现所需的输出。
请参考https://www.geeksforgeeks.org/c-operator-precedence-associativity/以了解操作员的工作方式。
https://stackoverflow.com/questions/56522783
复制相似问题