reinterpret_cast<int *>(字符 *)

reinterpret_cast<int *>(char *)

本文关键字:字符 gt lt reinterpret int cast      更新时间:2023-10-16

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

reinterpret_cast<int *>(char *)

或:

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

为什么呢?

这个*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; 
  • 你能解释一下这是怎么回事吗?

您使用单位化变量: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它必须是整数。

如何使用值初始化指针?

你没有。这就是拥有指针的意义所在。您不会使用值初始化它。您可以使用可变地址初始化它。

我们一步一步来分析一下:

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