此代碼:在void *指針中引用問題?
int p = 10;
void *q;
*q = 10;
不會編譯:
'=':無法從 '詮釋' 轉換成 '無效*'
然而,這個代碼編譯罰款:
int p = 10;
void *q;
q = &p;
背後的原因是什麼?
此代碼:在void *指針中引用問題?
int p = 10;
void *q;
*q = 10;
不會編譯:
'=':無法從 '詮釋' 轉換成 '無效*'
然而,這個代碼編譯罰款:
int p = 10;
void *q;
q = &p;
背後的原因是什麼?
甲void *
指向未知類型的數據(如果它被初始化的第二代碼塊,其你的不是)。
您只能分配給已知類型的變量,或者通過已知類型的指針。
int p = 10;
void *q = &p;
*(int *)q = 20;
if (p != 20)
...something has gone horribly wrong...
此轉換void *
成int *
,然後分配一個值到解除引用的整數指針。
第一個片段是未定義的行爲。
您無法取消引用無效指針。即使你可以,你的代碼將寫入一些隨機存儲器地址,並可能崩潰。
在要分配的正常工作的指針的地址,因爲你可以指定任何存儲器地址到void*
兩段代碼(嘗試)做不同的事情。
第一個嘗試將值10分配給對象q
指向。這裏有兩個問題。首先你從來沒有初始化指針。您需要先將其指向某處,然後才能更改其指向的值。其次,你不能取消void*
,因爲這個類型是未知的。
第二段代碼是將變量p
的地址分配給q
。此q
之後將指向存儲在p
中的對象。
這在內存q
點更改地址:
q = &p;
這不能什麼q
點式的人物出來(int
,long
,std::string
,int**
等);所有它知道是在內存中的位置:
*q = 10;
你可以這樣做:
int *iq = static_cast<int*>(q);
*iq = 10;
你可能想了解更多關於void*
s。
void *不知道它拿着多少,它拿着什麼?
所以你可以指定任何指針類型,因爲它可以包含任何大小!但不能分配一個值,因爲它不知道它必須存儲什麼......!
您的指針q
不指向任何內存位置。所以你不能給它分配值。
錯誤。什麼錯誤? (在這種情況下,它有點顯而易見,但你應該總是發佈錯誤。) –
'=':不能從'int'轉換爲'void *' – teacher
你的編譯器很奇怪......它想要從'* q = 10;'''int'''void *' ???在該語句中,'10'的類型爲'int','* q'的類型爲'void'。 – pmg