2012-04-03 105 views
0

我在C初學者,比方說,我有這樣的代碼:s ++和* s ++有什麼區別嗎?

#include <stdio.h> 
void test(char *t) 
{ 
    t++; 
    *t = 'e'; 
} 

void main() 
{ 
    char a[] = "anto"; 
    printf("%c\n",a[1]); 
    test(a); 
    printf("%c\n",a[1]); 
} 

這是示例代碼,當我搞清楚指針如何工作。根據我的聲明:

t++; 
在上面的代碼

1char在調用函數test增加陣列a的地址。好吧,據我所知,*用於檢索指針指向的對象值。

但是,很奇怪,當我改變t++

*t++; 

我像以前一樣得到同樣的輸出。我完全同意這一點,上面的說法 *t++;應該改變內容只知道,根據運營商的定義*

但是這又改變了地址t。怎麼來的?我在哪裏弄錯了這個概念?

預先感謝

+5

注意:始終在啓用警告的情況下編譯,例如'gcc -Wall'。 *閱讀並注意*這些警告 – 2012-04-03 11:35:56

+0

IIRC在空指針上做數學只是有一個未定義的結果,而解引用空指針有未定義的行爲。所以有區別,但只有t爲空時才顯示出來。 – harold 2012-04-03 11:41:15

+0

@PaulR:謝謝你的建議。 – 2012-04-03 11:44:30

回答

10

表達*t++被解析爲*(t++) - 所述++仍然適用於指針,而不是內容。 t++的值是增量前指針自身的值,而*t++的值是指針在增量前指向的值。

+0

上找到更多相關的問題。雖然這是正確的,但我不認爲它真的回答了OP的問題 – 2012-04-03 11:37:33

+0

@PaulR 1.它的確如此。 2.(對於所有人):這就是爲什麼即使使用'const char *'也可以實現這個技巧,因爲你不能增加一個const值,但是你可以通過一個指向它的指針來實現。 – 2012-04-03 11:38:50

+0

哦謝謝你的回答...現在我很清楚...... – 2012-04-03 11:45:35

2

++優先於*因此您的表達式計算爲*(t++)

4

(*)運算符用於取消引用指針。

t++; 

作爲語句返回指針,其中作爲

*t++; 

返回該噸指針指向遞增它前的值的前一位置。

這兩個語句的副作用是相同的,所以你得到相同的輸出。

*t++; 

語句不會更改t指向的值,因爲++運算符優先於*運算符。

1

後綴++具有比一元*更高的優先級,所以*t++被解析爲*(t++);您正在取消引用表達式t++的結果;作爲副作用,t是先進的。

一元*和一元++相同優先,因此如果他們出現在同一個表達式,他們將評估左到右。表達式*++t將被解析爲*(++t);您將表達式++t的結果解引用,並且作爲t的副作用是先進的。

++*t將被解析爲++(*t);您正在增加表達式*t的結果。

相關問題