reinterpret_cast <int * =“”>(char *)</int>

时间:2013-06-03 23:33:39

标签: c++ pointers int

当动态分配char *类型的缓冲区时,如果要将其强制转换为特定类型,是否应该使用:

reinterpret_cast<int *>(char *)

或:

static_cast<int *>(static_cast<void *>(char *))

为什么?

5 个答案:

答案 0 :(得分:5)

*pk = new int(2);应为pk而不是*pk

在您宣布指针int * pointer之后,对point的所有引用都引用了一个地址,所有对*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; 

答案 1 :(得分:1)

  • 你能解释一下这里发生了什么吗?

您使用了单位变量: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

答案 2 :(得分:0)

int* pk = nullptr;

在此声明pk是指向int的指针。

*pk = new int(2);

*pk的类型为intnew int(2)的返回类型为int*

答案 3 :(得分:0)

pk是指针,*pk是指向的值。

所以将代码更改为,

int* pk = new int;

pk = reinterpret_cast<int*>(2);

当分配给pk时,右侧必须是指针,对于*pk,它必须是整数。

答案 4 :(得分:0)

  

如何使用值初始化指针?

你没有。这是指针的。您没有使用值初始化它。用变量地址初始化它。

让我们一步一步地分析它:

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指向了有意义的东西。