当动态分配 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 = #
您使用统一变量: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
int* pk = nullptr;
在这里,您声明 pk 是指向int
.
*pk = new int(2);
is的类型和*pk
isint
的返回类型。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 指向了一些有意义的东西。