我有一个关于增加指针的问题,我不太明白。
让我们看看2个小程序:
int iTuna=1;
int* pPointer= &iTuna;
*pPointer = *pPointer + 1 ; //Increment what pPointer is pointing to.
cout << iTuna << endl;
在第一个程序中,我将pPointer指向的内容增加为“* pPointer = * pPointer +1”。 正如我所料,iTuna改为“2”,程序打印出值“2”
int iTuna=1;
int* pPointer= &iTuna;
*pPointer++; //Increment what pPointer is pointing to.
cout << iTuna << endl;
system("PAUSE");
return 0;
这里我增加了pPointer指向的增量,这是“* pPointer ++”。但是这里iTuna保持为“1”并且程序打印出值“1”。 虽然我期望这个作为第一个工作,但事实并非如此。
请帮助我并告诉我为什么第二代代码不能像我预期的那样工作以及如何解决它。
谢谢
答案 0 :(得分:11)
*pPointer++;
相当于
*pPointer;
pPointer++;
所以它递增指针,而不是取消引用的值。
您可能会在
等字符串复制实现中不时看到此信息 while(*source)
*target++ = *source++;
由于你的问题是运算符优先级的问题,如果要解除指针,然后递增,你可以使用parens:
(*pointer)++;
答案 1 :(得分:3)
++运算符优先级高于* d dereference。
你写的实际上是
*(p++)
但是你应该使用
(*p)++
答案 2 :(得分:1)
*ptr++; - increment pointer and dereference old pointer value
相当于:
*(ptr_p++) - increment pointer and dereference old pointer value
以下是值
的增量方式(*ptr)++; - increment value
这是因为++
的优先级高于*
,但您可以使用()
答案 3 :(得分:1)
在第二个程序中,您没有增加pPointer地址的内容,但是您正在增加指针。因此,假设pPointer值(分配给iTuna的memmory位置)为1000,那么它将位置增加到1000 + 2(int size)= 1002而不是内容增加到1 + 1 = 2。在上面的程序中,您正在访问指针位置内容。这就是为什么你没有得到预期的结果
答案 4 :(得分:0)
*pPointer++;
- 此处取消引用运算符(*
)的优先级高于递增运算符(++
)。所以这个语句首先解除引用并递增指针。在此之后,您将打印iTuna
的值,它将为您提供相同的值。您不是通过取消引用指针变量(*pPointer
)来打印该值,因为这将导致崩溃(未定义的行为)。因为pPointer
现在已递增。
使用类似(*pPointer)++;
来增加pPointer
指向的值。
要清楚地了解在增量声明之前和之后打印存储在pPointer
变量中的地址。
答案 5 :(得分:0)
在第一种情况下,指针的内容会增加,因为* pPointer对应于变量iTuna的内容。
在第二个中,因为pPointer增加了指针地址,所以内容没有增加。记住运算符优先级规则,后缀运算符(例如,增量(++)和减量(-))比前缀运算符(例如,解除引用运算符(*))具有更高的优先级。因此,撰写
*pPointer++
等效于
*(pPointer++)
它的作用是增加pPoiner的值(因此它现在指向下一个元素),但是由于++被用作后缀,因此整个表达式被求值为指针最初指向的值(地址)它在递增之前指向)。
符合您期望的正确代码如下:
++*pPointer
或
(*pPointer)++