2011-09-01 75 views
5

此代碼:在void *指針中引用問題?

int p = 10; 
void *q; 
*q = 10; 

不會編譯:

'=':無法從 '詮釋' 轉換成 '無效*'

然而,這個代碼編譯罰款:

int p = 10; 
void *q; 
q = &p; 

背後的原因是什麼?

+0

錯誤。什麼錯誤? (在這種情況下,它有點顯而易見,但你應該總是發佈錯誤。) –

+0

'=':不能從'int'轉換爲'void *' – teacher

+0

你的編譯器很奇怪......它想要從'* q = 10;'''int'''void *' ???在該語句中,'10'的類型爲'int','* q'的類型爲'void'。 – pmg

回答

5

void *指向未知類型的數據(如果它被初始化的第二代碼塊,其你的不是)。

您只能分配給已知類型的變量,或者通過已知類型的指針。

int p = 10; 
void *q = &p; 

*(int *)q = 20; 

if (p != 20) 
    ...something has gone horribly wrong... 

此轉換void *int *,然後分配一個值到解除引用的整數指針。

4

任何指針都可以轉換爲void*,但將指針取消引用到void是非法的。

+3

地獄是啊,你不能寫點什麼都沒有的東西。 – kenny

1

第一個片段是未定義的行爲

0

您無法取消引用無效指針。即使你可以,你的代碼將寫入一些隨機存儲器地址,並可能崩潰。

在要分配的正常工作的指針的地址,因爲你可以指定任何存儲器地址到void*

1

兩段代碼(嘗試)做不同的事情。

第一個嘗試將值10分配給對象q指向。這裏有兩個問題。首先你從來沒有初始化指針。您需要先將其指向某處,然後才能更改其指向的值。其次,你不能取消void*,因爲這個類型是未知的。

第二段代碼是將變量p的地址分配給q。此q之後將指向存儲在p中的對象。

1

這在內存q點更改地址:

q = &p; 

這不能什麼q點式的人物出來(intlongstd::stringint**等);所有它知道是在內存中的位置:

*q = 10; 

你可以這樣做:

int *iq = static_cast<int*>(q); 
*iq = 10; 

你可能想了解更多關於void*s

2

void *不知道它拿着多少,它拿着什麼?

所以你可以指定任何指針類型,因爲它可以包含任何大小!但不能分配一個值,因爲它不知道它必須存儲什麼......!

0

您的指針q不指向任何內存位置。所以你不能給它分配值。