-1

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

reinterpret_cast<int *>(char *)

或者:

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

为什么?

4

5 回答 5

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; 
于 2013-06-03T23:36:06.390 回答
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

于 2013-06-04T03:28:11.093 回答
0
int* pk = nullptr;

在这里,您声明 pk 是指向int.

*pk = new int(2);

is的类型和*pkisint的返回类型。new int(2)int*

于 2013-06-03T23:39:51.743 回答
0

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

因此,将您的代码更改为,

int* pk = new int;

pk = reinterpret_cast<int*>(2);

分配给pk右侧时必须是指针,因为*pk它必须是整数。

于 2013-06-03T23:43:44.843 回答
0

如何用值初始化指针?

你没有。这就是有指针的意义所在。您不使用值对其进行初始化。你用变量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 指向了一些有意义的东西。

于 2013-06-04T00:12:48.670 回答