2011-11-26 49 views
0

我的努力,以更好地瞭解指針,我寫了這個代碼:初始化指針,C和C之間的差異++編譯器(GCC-4.3.4)

int *a = 17;

printf("%d", a+3);

它在C編譯罰款使用gcc-4.3.4:http://ideone.com/abotd

然而它無法與C++編譯:http://ideone.com/IdGHy

我想知道爲什麼。我想知道發生了什麼:sizeof(int)是4,當我寫了+ 3而不是將3添加到17時,3 * 4正在被添加。

不過,如果有人能更有說服力地解釋它,我將不勝感激。

謝謝!

回答

5

對於C++版本試試這個:

int *a = (int *)17; 
printf("%d", a + 3); 

而且是你的解釋是正確的......

這就是所謂的指針運算和運作的,你說話的方式。但是請注意,您在此處使用的代碼將一個常量值分配給指向int的指針在現實生活中很少實現。指針值通常來自某種內存分配函數,例如C中的malloc或C++中的new(儘管new不是函數)。

+0

這是接近我尋求的答案。 我不知道我的理解是如何將它作爲指針算術指針和作爲派生'17'值的整數來處理。 –

+0

這是C/C++語言的特性之一。是的,17是一個'int'文字,但在C語言中,編譯器在C++中自動將其轉換爲'int *',您必須手動強制轉換。我希望這是你所問的。 – mtahmed

+0

所以,如果我理解正確:**步驟1 ** - 編譯器看到'a'是'int *',並且明白它應該自己解除引用(在C++中我必須自己做) - 所以這是我如何獲得'17'部分。 **步驟2 ** - 然後編譯器發現它應該向'a'加3,但由於'a'爲'int *'類型,它知道它應該增加3 * 4(因爲sizeof(int)= 4)。最終結果是17 + 12 = 29. 這是正確的嗎? –

2

你想要的東西,如:

int foo = 17; 
int* a = &foo; 
printf("%d\n", (*a) + 3); 

您發佈嘗試指針設置爲17地址,這可能不是一個有效的地址代碼,即使它是你需要投從int到指針(int* a = (int*)17;)。然後,您將該地址添加到該地址,然後輸出地址,其上面有三個大小爲int的地址。我真的不認爲這就是你想要的。

3

這是不正確的C++代碼。

int * a = 17; 

這是無效的。您不能將int隱式轉換爲指針。你可能投它,但如果我是你,我不會這樣做。

+1

轉換它:'int * a =(int *)17'。只是不要試圖修改'a'或者你的應用程序會崩潰。 –

+3

@druciferre你的意思是修改'* a' ... – mtahmed

+0

@mtahmed,好趕上 –