簡體   English   中英

C ++遞增指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM