2016-07-21 34 views
3

在我學習C時(我對它很陌生),我在玩指針。在這裏你可以看到我的代碼:c:在函數中使用指針作爲輸入時,通過使用*來增加指針的值++ ++不起作用

#include <stdio.h> 

void change(int *i) 
{ 
    *i += 1; 
} 

int main() 
{ 
    int num = 3; 

    printf("%d\n", num); 
    change(&num); 
    printf("%d\n", num); 

    return 0; 
} 

我的目標是取代不重新分配它像這樣增加NUM值:

num = change(num); 

這就是爲什麼我用的是&傳球num的存儲位置:所以它可以用作指針。在此版本之前,代碼中的所有內容都是相同的。唯一不同的是,我說*i++;而不是說*i += 1;

現在我的問題是爲什麼我不能說*i++

+8

運算符優先級:後綴增量的優先級高於一元間接優先級,優先級高於複合賦值。 – EOF

+0

正因爲德國人,對於英語不好的藉口! – Olaf

+0

@Olaf Ich bin Deutscher,仍然有英文問題。 – Michi

回答

7

現在我的問題是,爲什麼我不能說* I ++

由於運算符優先級,*i++是一樣*(i++)

*(i++); 

等同於:

int* temp = i; // Store the old pointer in a temporary variable. 
i++;   // Increment the pointer 
*temp;   // Dereference the old pointer value, effectively a noop. 

那是不是你想要的。您需要使用(*i)++++(*i)。這些將首先解引用指針,然後增加指針指向的對象的值。

+0

'*(i ++),這不是你想要的東西嗎?這對於OP來說是很好的知道爲什麼。 – Michi

+1

@Michi,很好的建議。 –

2

這是由於operator precedence

您可以看到「後綴增量」處於優先級1,而「級別2(間接引用)」,級別1首先發生。因此,您需要使用括號來使取消引用先發生:(*i)++

所不同的是(*i)++說找到i指向的內存,並增加它(你想要的)。 *(i++)表示增量i本身(因此它指向下一個內存地址),並提供解除;這可能是沒有任何操作的,而不是你想要的。

+0

'所以你需要使用括號來得到解引用首先發生:(* i)++'你可以向OP解釋如果他/她不這樣做會發生什麼。 – Michi