C 语言中 * ptr + = 1和 * ptr + + 的区别

我刚开始学习 C 语言,在做一个关于将指针传递给指针作为函数参数的例子时,我发现了一个问题。

这是我的示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int* allocateIntArray(int* ptr, int size){
if (ptr != NULL){
for (int i = 0; i < size; i++){
ptr[i] = i;
}
}
return ptr;
}


void increasePointer(int** ptr){
if (ptr != NULL){
*ptr += 1; /* <----------------------------- This is line 16 */
}
}


int main()
{
int* p1 = (int*)malloc(sizeof(int)* 10);
allocateIntArray(p1, 10);


for (int i = 0; i < 10; i++){
printf("%d\n", p1[i]);
}


increasePointer(&p1);
printf("%d\n", *p1);
p1--;
free(p1);
fgets(string, sizeof(string), stdin);
return 0;
}

当我将 *ptr+=1修改为 *ptr++时,问题出现在第16行。预期的结果应该是整个数组和数字1,但是当我使用 *ptr++时,结果是0。

+=1++有什么不同吗? 我以为它们是一样的。

20806 次浏览

这种差异是由于操作符优先级不同造成的。

后增量操作符 ++的优先级高于解引用运算符操作符 *。所以 *ptr++等价于 *(ptr++)。换句话说,post 增量修改的是指针,而不是它指向的内容。

The assignment operator += has lower precedence than the dereference operator *, so *ptr+=1 is equivalent to (*ptr)+=1. In other words, the assignment operator modifies the value that the pointer points to, and does not change the pointer itself.

你的问题所涉及的3个营办商的优先顺序如下:

增量后 ++ > 解引用 * > 赋值 +=

您可以检查这个 呼叫的主题的进一步细节。

在解析表达式时,在某一行中列出的操作符与其参数之间的绑定(就像用括号一样)要比列在其下一行中的操作符更紧密。例如,表达式 *p++解析为 *(p++),而不是 (*p)++

长话短说,为了使用后递增运算符来表示这个赋值,你需要在解引用运算符中加上括号,以使这个运算优先于 ++,就像在这个 (*ptr)++中一样

让我们应用括号来显示 行动次序

a + b / c
a + (b/c)

我们再来一次

*ptr   += 1
(*ptr) += 1

再来一次

*ptr++
*(ptr++)
  • *ptr += 1中,我们将指针 points增加到的变量的值。
  • *ptr++中,我们递增指针 之后,我们的整个语句(代码行)完成,并返回一个对指针 分数所指向的变量的引用。

后者允许你做如下事情:

for(int i = 0; i < length; i++)
{
// Copy value from *src and store it in *dest
*dest++ = *src++;


// Keep in mind that the above is equivalent to
*(dest++) = *(src++);
}

这是将 src数组复制到另一个 dest数组的常用方法。

问得好。

在 K & R“ C 编程语言”“5.1指针和地址”中,我们可以得到这个问题的答案。

一元运算符 * 和 & 绑定比算术运算符更紧密

*ptr += 1      //Increment what ptr points to.

“像 * 和 + + 这样的一元运算符将 从右到左关联起来。”

*ptr++        //Increment prt instead of what ptr point to.

//工作原理类似于 * (ptr + +)。

正确的方法是:

(*ptr)++      //This will work.

* ptr + = 1: ptr 指向的增量数据。 * ptr + + : 指向下一个内存位置的增量指针,而不是指向指针所指向的数据。