2016-04-15 18 views
-1

我已經閱讀了很多書籍和互聯網上的答案,說如果你取消了一個指針,那麼它會給你存儲的價值。但是,如果我們考慮代碼:取消引用指針是否標識正在指向的對象或返回存儲在其中的值?

int x = 3,*ptr; 
ptr = &x; 
printf("%d",*ptr); /*print value in x*/ 
printf("%d",sizeof(*ptr));/*gives sizeof of x*/ 
printf("%u",&*ptr);/*give address of x*/ 

如果取消引用是給存放在X值,那麼我們將有:的sizeof(3)和& 3不作任何意義,但如果它是返回變量x本身那麼一切纔有意義:& X:給出x地址的sizeof(X):給出x的大小和

printf("%d",x); //print value in x.// 

所以我的問題是什麼呢解引用指針給由它的值或指向的對象存儲在對象中?

+0

sizeof只是運算符,[編譯期間評估](http://stackoverflow.com/a/2615205/5601069) - 所以你沒有'x'的地址。因此它打印指針的大小。 – Enkelli

+0

@Enkeli:它不總是編譯時評估。 – Olaf

+0

指針指向分配的對象,而不是值。 – Lundin

回答

2

你的世界中的「對象」和「存儲在對象中的值」之間的區別是什麼?

可以編寫sizeof *ptr的表達式sizeof (*ptr)計算出*ptr的值的大小。由於ptr的類型爲int *,因此該值的類型爲int

僅僅因爲*ptr的計算結果爲3並不意味着它與文字3等價,但它是一個不同的表達式。取一個文字的地址是沒有意義的,但是你不能僅僅替換文字,&*ptrptr相同,而不是&3

+0

那麼當我們做* ptr時會發生什麼?如果它不等於3,那麼它相當於什麼? – user6112826

+0

爲什麼它必須與此類似的「等價」?爲什麼它不能僅僅意味着「指針所指向的價值」,無論哪種形式在特定的環境中最有意義? – unwind

相關問題