2012-11-04 42 views

回答

4

如果代碼是int *a = *b;那麼*b是指向一個整數的指針(必須與a的類型匹配)。這意味着b是指向一個整數的指針。然後a將包含*b指向的地址,而不是指向b指向的地址。

但是,如果代碼是int *a; *a = *b;那麼這就不同了。在這種情況下,您正在將b指向的對象複製到a指向的地址中。該對象必須是整數,因此a將指向整數的副本(因此您可以更改*b*a不會更改)。順便說一句,如果a在未初始化,那將是未定義的行爲(很可能是崩潰)。

0

*a = *b這意味着具有地址b複製的存儲器內容到存儲器具有地址a

如果(* A == * b)中,這意味着:如果檢查的存儲器具有地址a含量等於內容的內存地址b

0

如果int * a = * b,會指向b引用的對象嗎?

這取決於b是什麼。

編輯此外,如果double * a = 3.0,是否指向3.0?

不,這是一個無效的陳述。您應使用地址初始化a

0

必須給你警告...轉換intint *沒有投 這也取決於究竟是什麼p

0

嘗試以下操作:

#include <stdio.h> 

int main(void) 
{ 
    int val = 5; 
    int *b = &val; 
    int *a = *b; 

    printf("&val = %p; b = %p, a = %p\n", &val, b, a); 

    return 0; 
} 

輸出:

&val = 0xbfb652d4; b = 0xbfb652d4, a = 0x5 

(地址值可能會更改)

a實際上是一個指針,其值爲b指向的值。除非b本身是指向指針的指針,否則a可能指向無效的位置。

+0

C和C++中的代碼都是無效的。初始化具有int類型的值爲* b的指針'int * a'是非法的。 – AnT

+0

它可能在語義上無效,但我編譯並運行它;甚至不會產生警告。 – Penz

+0

這意味着您的編譯器會故意設置爲「非常鬆散」的語言一致性。我知道一些編譯器會爲這樣的代碼生成警告,這些代碼已經處於「鬆散」的一面,儘管正式足夠(語言需要診斷消息,任何診斷消息)。但是,如果你的編譯器根本沒有生成任何消息......這很奇怪。 – AnT

1

由於您沒有提供關於b的信息,因此您的問題的第一部分沒有任何意義。

至於第二部分(約double *a = 3.0)... C和C++語言都禁止使用非指針值(除空指針常量外)指針的初始化。這立即意味着double *a = 3.0不是有效的C或C++代碼。它根本不會編譯。再例如,int *a = 5代碼也適用。

在C和C++中,爲了將非指針值轉換爲指針類型,需要顯式強制轉換。這種轉換的結果是實現定義的。

0

指針是任何可變的參考,並存儲在它的其他變量的位置... 你的例子應該是這樣的:

雙一= 3.0; int b * = a;

所以指針(B)將同闖民宅的3.0

相關問題