[英]C++ Incrementing a Pointer
為什么我可以做類似* x = * x + 1;的事情,卻可以做類似* x = * x ++;的事情? 似乎沒有任何影響?
碼:
// Example program
#include <iostream>
#include <string>
using namespace std;
void doSomething(int *x, int *y)
{
*x = *x++;
*y = *y + 5;
}
int main()
{
int x = 4;
int y = 3;
doSomething(&x, &y);
cout << "x is now: " << x << endl; //outputs 4
cout << "y is now: " << y << endl; //outputs 8
return 0;
}
這個說法
*x = *x+1;
可以寫成
*x = ++*x;
當然可以寫
++*x;
至於這個說法
*x = *x++;
那等於
*x = *( x++ );
並且具有未定義的行為,因為后遞增運算符的副作用未排序。
后綴運算符++
比dereference *
運算符具有更高的優先級。 語句*x = *x++;
如下執行*x = (*(x++))
如您所見,首先執行++
運算符,使指針指向其指向的位置。 從那里開始執行dereference
運算符。 如果要增加x
的實際值,只需寫++*x;
因為所有表達式都遵循運算符優先級規則 。
如您在表格中所見,運算operator++
優先級高於operator*
您可以更好地跟隨括號,代碼:
*x = *x++;
等效於:
*x = *(x++);
簡而言之,您要在取消引用之后增加指針的值。
在內存中,它發生類似以下內容:
| x = 4 | <---- &x
| trash |
| trash |
您增加指針,它將指向內存中的下一個單元格:
| x = 4 |
| trash | <---- &x+1
| trash |
並將其值分配給自己,無論如何都是垃圾。
為了避免誤解,括號的使用應該是有效的幫助。
使用以下方法修復:
*x = ++(*x);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.