簡體   English   中英

reinterpret_cast <int *> (字符*)

[英]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 = &num; 
  • 你能解釋一下這是怎么回事嗎?

您使用單元化變量: 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的類型為intnew 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM