当动态分配char *类型的缓冲区时,如果要将其强制转换为特定类型,是否应该使用:
reinterpret_cast<int *>(char *)
或:
static_cast<int *>(static_cast<void *>(char *))
为什么?
答案 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 = #
答案 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
答案 2 :(得分:0)
int* pk = nullptr;
在此声明pk是指向int
的指针。
*pk = new int(2);
*pk
的类型为int
,new 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指向了有意义的东西。