[英]reinterpret_cast<int *>(char *)
動態分配char *類型的緩沖區時,以及要將其強制轉換為特定類型時,應使用:
reinterpret_cast<int *>(char *)
要么:
static_cast<int *>(static_cast<void *>(char *))
為什么呢?
*pk = new int(2);
應該是pk
而不是*pk
在將指針聲明為int * pointer
,所有point
引用都point
一個地址,而所有*pointer
引用都*pointer
該地址中包含的內容。 默認情況下,指針不會指向有效的內存位置,您必須分配一個有效的地址或調用new
。 這就是為什么當您寫pk = &k
,不會出現分段錯誤-因為pk
現在包含k
的地址,該地址指向有效的內存位置。
指針的語法可能會有些混亂,主要是因為*
根據您的使用方式可能具有多種含義。 這里是一個簡短的解釋:
*
表示您正在聲明一個指針(即int * pk
)。 *
是要乘的符號(即4 * num
)。 *myPointer
或(*mypointer)
)。 由於new
返回一個地址,因此您要為pk
分配一個地址,而不是pk
指向的值。
如果要初始化指針,請使用new
語句聲明它。 像這樣:
int * pk = new int;
但是沒有編譯時功能聲明一個自包含的指針和值。 與之最接近的是,通過聲明一個單獨的變量,就像已經做的那樣,並使用該變量的地址初始化指針。 像這樣:
int num = 43;
int * p = #
您使用單元化變量: http : //en.wikipedia.org/wiki/Uninitialized_variable
int* pk; // declare variable `pk` of type `int*` but do not initialize it
*pk = 2; // use unitialized variable. `*` is dereference operator. Seg fault
int k; // declare variable `k` of type `int`, not initialized
pk = &k; // initialize variable `pk` with address of variable `k`
*pk = 3; // use initialized variable. Ok now
取消引用運算符: http : //en.wikipedia.org/wiki/Dereference_operator
int* pk = nullptr;
在這里,您聲明pk是一個指向int
的指針。
*pk = new int(2);
*pk
的類型為int
, new int(2)
的返回類型為int*
。
pk
是指針,而*pk
是它指向的值。
因此,將您的代碼更改為
int* pk = new int;
pk = reinterpret_cast<int*>(2);
分配給pk
,右側必須是指針,而*pk
則必須是整數。
如何使用值初始化指針?
你不知道 這是具有指針的點 。 您不使用值對其進行初始化。 您可以使用變量address對其進行初始化。
讓我們逐步分析它:
int* pk;
您有一個指針,並且它尚未初始化,因此,它比沒用的要糟。
int* pk = nullptr;
更好的是,至少您可以使用if
語句檢查它是否指向任何內容。
if(pk)
{
//do operations on pointed value *pk
}
else
{
//Houston, we have a problem
}
目前,這些操作沒有任何意義
*pk = 2; //you haven't pointed with pk to anything
*pk = reinterpret_cast<int*>(2); //????? *pk is int, and right-hand side is int*. What do you expect to do with it?
此代碼有效
int k;
pk = &k;
*pk = 3;
因為您實際上將pk指向了有意義的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.