2012-01-24 23 views
1

我看到一個非常奇怪的代碼片段,我不太清楚,如果我的理解是正確的:指針運算C和澆鑄

#include <stdio.h> 

int main(char *argc, char **argv) 
{ 
    char a[50]; 
    *(char *) (a + 2) = 'b'; // <== THE LINE WHICH CONFUSES ME 

    printf("value: %c\n", a[2]); 
    return 1; 
} 

是不是正確的,我們走2桶進一步施放「B」變成一個指向b的指針然後解引用它?

+0

你已經有了一些很好的答案。請記住,使用C語言,您可以享受安全編碼和指針算術的優勢 - 只需選擇您想要的那個:) –

+1

'argc'參數實際上應該是'int'。在那裏有計算機,'int'和'char *'具有不同的表示,使你的程序行爲非常不明確。你也不用'argc'或'argv'做任何事情,所以最簡單的事情就是不要聲明它們:'int main(void){/ * ... * /}'。還有一點是,不同操作系統可以對返回值1進行不同的解釋。首選'返回0;'或'返回EXIT_SUCCESS;'或'返回EXIT_FAILURE;'。 – pmg

回答

6

這是完全等價的

*(a + 2) = 'b'; 

演員是不必要的。

它所做的只是向陣列中添加兩個指針,其中指針a的衰減,解引用結果指針,並將字符'b'指定給該內存位置。

a是指針時,代碼a[x]完全等同於*(a + x)。所以在你的情況下,*(a + 2) = 'b'a[2] = 'b'完全一樣。

1

您未投下'b'

您投(a+2)char*(它什麼都不做,因爲它已經char*),尊重它,並把它放在那裏'b'

是的,我們進一步去2桶是正確的。

3

*(char *) (a + 2)

相當於

a[2]

根據定義,a[2]*(a + 2)a + 2的值已經是char *類型,所以a + 2char *的演員陣容,如(char *) (a + 2),是無操作。

+0

儘管在C中的指針類型(和C++中的指針類型之間的C風格轉換)之間進行轉換總是無操作:) –

1

不,你把a爲指針,由兩個增加它,然後將其轉換爲(char*)(廢鑄件,它已經是char*),取消對它的引用,然後存儲'b'成。

它是完全相同的,因爲這:

a[2] = 'b'; 
2
*(char *) (a + 2) = 'b'; // <== THE LINE WHICH CONFUSES ME 

這條線的字面意思是非常相同

a[2] = 'b' 

第一鑄造(char*)是多餘的,因爲一已經是char類型。事實上,索引轉換爲增加和取消偏轉,即

a[n] === *(a + n) 

關於C一個鮮爲人知的事實:你可以寫以及

n[a] 

,並得到同樣的結果。