指针的这些用法有什么区别?

时间:2012-03-03 21:27:49

标签: c++

int *p1=10;

int *p2;
p2=new int;
*p2=10;

这两个变量有什么区别? 是不是在堆中分配了变量?

4 个答案:

答案 0 :(得分:4)

不同之处在于第一个不编译:

lol.cpp:2:10: error: cannot initialize a variable of type 'int *' with an rvalue of type 'int'
    int *p1 = 10;
         ^    ~~
1 error generated.

而第二个在堆上创建一个值为10的int,并在堆栈上分配一个指向该值的指针。

如果第一个编译了,比如说你添加了一个演员,它会将值10分配给指针 p1,这意味着p1会指向到内存地址10 = 0x0A*p1会尝试将该地址解引用为int,这将是一个段错误。 (如果你在进程的内存空间中使用了不同的数字,那么根据内存的内容,它会是一些任意整数。)

答案 1 :(得分:1)

根据你问题的另一部分。不,它们都没有在堆上分配。实际上它们都是在堆栈上分配的。只有第二个指向new运算符在堆上分配的区域。它们将被分配在堆上,如果它们是使用new全部对象的一部分。

答案 2 :(得分:0)

表达式int* p1 = 10不应该编译:它初始化一个带整数的指针!

答案 3 :(得分:0)

p1p2都是整数变量的指针。

p1的初始化是错误的。作为指针,它应该包含整数变量的地址。并且您将“地址”指定为值“10”:您将其设置为指向地址0x0000000A,这几乎肯定无效。