檢測我指的是什麼
回答
...對象由p和d指出不同類型的? (p指向int和d指向int整數):
那麼,首先,這是不正確的。是的,d
指向一個數組的開始,但是它們都指向完全相同的東西;一個int
。您是否可以安全地對指針執行算術運算並對其進行解引用是另一個問題。
當您解除引用它們時,機器會簡單地返回一個適當大小的內存塊並將其解釋爲int。
C++並不完全是元編程的goto語言,如果你在處理指針,它究竟有什麼關係嗎?我從來沒有發現需要這樣做。你知道你有一個指針,你(應該)知道它是指向一個int
還是一堆int
s,因此你究竟是在試圖解決什麼問題?
我會說沒有。 p和d都是指向int的指針,d是指向數組頭的指針 - 頭是int。整數的
數組不是d的類型 - 它是一個指針到int
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
int* p = new int();
int* d = new int[20];
float* f = new float();
if (typeid(p) == typeid(d))
cout << "equal" << endl;
else
cout << "not equal" << endl;
if (typeid(p) == typeid(f))
cout << "equal" << endl;
else
cout << "not equal" << endl;
}
輸出:
equal
not equal
有一種方法來檢測,如果由p和d指出對象是不同的類型?
你的假設是錯誤的。 p和q都指向相同的類型,int。
-1它們都是指向int的指針......即使是'typeid(* p)'(對於'q'也是一樣)只是'int'。 – 2012-01-30 17:48:48
*是的,你可以,但你的例子是指向相同的類型。* - 所以答案是......不,你不能。 – 2012-01-30 17:54:38
如果您實現自己的new
和new[]
你可以,但這裏的龍會吃你還活着:
void * operator new(size_t size)
{
size_t * allocation = (size_t *)malloc(size+sizeof(size_t));
*allocation = size;
return allocation + 1;
}
void * operator new[](size_t size)
{
size_t * allocation = (size_t *)malloc(size+sizeof(size_t));
*allocation = size;
return allocation + 1;
}
template<typename T> size_t allocationCount(T*memory)
{
size_t * allocation = reinterpret_cast<size_t*>(memory) - 1;
return *allocation/sizeof(T);
}
int main()
{
int * fred = new int;
int * nurk = new int[30];
cout << allocationCount(fred) << endl;
cout << allocationCount(nurk) << endl;
}
輸出:
1
30
呃!真?這種不可能實現的不足和不可用的方法。你有沒有考慮過'new int [1]'?一旦你處理了這個問題,你就可以轉移到其他幾十個人面前,試圖讓這個工作起作用。 – 2012-01-30 19:24:18
很高興你喜歡它! – Slagh 2012-01-30 20:19:32
- 1. 什麼是服務檢測?
- 2. 什麼是社區檢測的成員?
- 3. 如何檢測我使用的是什麼版本的JavaDB/Derby?
- 4. 檢測觸摸並按住UITableViewCell,我的選擇是什麼?
- 5. Rails - 關聯 - 我指的是什麼?
- 6. 爲什麼我的指針不是NULL?
- 7. 什麼是XML BOM,如何檢測它?
- 8. 爲什麼不能python glob檢測我的拇指驅動器(以及我能做些什麼?)
- 9. 什麼是指向指針的指針?
- 10. 我如何檢測我的應用程序的用戶是什麼設備
- 11. 爲什麼我的單選按鈕檢測不到檢查?
- 12. 爲什麼不能檢測到JavascriptObject的運行時空指針?
- 13. 「this」是指什麼
- 14. Android - 我如何檢測什麼是崩潰我的應用程序?
- 15. \\ x80 - \\ xFF指的是什麼?
- 16. `this`指的是什麼?
- 17. 什麼是 「@」 是指在C#
- 18. 是什麼 - 是指查詢
- 19. 什麼是*是指在C
- 20. 檢測IDataReader是否爲空的最佳方法是什麼?
- 21. 檢測Windows是否運行ruby的正確方法是什麼?
- 22. 測試是做什麼的?
- 23. 這是指什麼?爲什麼?
- 24. 我該如何檢測什麼是Imgur圖片鏈接,哪些不是?
- 25. 測試指標在ansi x12消息中的含義是什麼?
- 26. C++ - 什麼是測試空指針最有效的方法?
- 27. 什麼是指我的文件,阻止我調用.delete()成功?
- 28. 爲什麼不檢測我的參數化類的類型?
- 29. 檢測是否已指定選擇器
你爲什麼要檢測呢?這是無法做到的。 – 2012-01-30 17:44:41
是的,在聲明之後用方括號(OK,這是一個愚蠢的評論) – 2012-01-30 17:46:11
這不完全是你問的,但它是相關的。編譯器可能爲了優化目的跟蹤類似的詳細類型信息。 http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule – 2012-01-30 17:52:59