用C++初始化123的双指针 我尝试过C++代码< /p> double* p; *p = 123.0;

用C++初始化123的双指针 我尝试过C++代码< /p> double* p; *p = 123.0;,c++,C++,在VS2010中,由于指针尚未初始化,它中断了。但我记得我在博客中读到过,忘记哪一个…,123.0是一个常量值,所以p现在指向一个常量值,你可以用*p得到123.0,但你不能改变这个值。哪一个是事实??谢谢大家! p不指向任何地方,您告诉它存储值123.0。它应该去哪里?这是未定义的行为 如果您想让它指向内存地址中的一个常量值,并且该值会一直存在,请尝试 static const double d = 123.0; const double* p = &d; 如果没有你想做的事情的背景

在VS2010中,由于指针尚未初始化,它中断了。但我记得我在博客中读到过,忘记哪一个…,123.0是一个常量值,所以p现在指向一个常量值,你可以用*p得到123.0,但你不能改变这个值。哪一个是事实??谢谢大家!

p不指向任何地方,您告诉它存储值123.0。它应该去哪里?这是未定义的行为

如果您想让它指向内存地址中的一个常量值,并且该值会一直存在,请尝试

static const double d = 123.0;
const double* p = &d;

如果没有你想做的事情的背景,我不能提出更多的建议。

你的方法是错误的,因为double*p;仅声明一个指针,但它未初始化,因此当您执行*p=123.0时;它触发了一种未定义的行为

您需要将p指向有效的双精度位置,以便可以修改它

尼尔的回答部分正确。在他的例子中,你不能再像在问题中那样改变*p了。你需要摆脱康斯特。在这个答案中,p指向堆栈上的内存

如果要创建堆分配的double,可以使用new关键字

但是,您必须确保在使用完此内存后将其删除

delete d;
由于您使用的是MSVC 2010,它包含一些C++11特性,因此更好的方法是使用unique_ptr。它的作用与原始指针相同,但它将管理指针分配的内存。。。i、 e.一旦超出范围,它将自动调用delete

unique_ptr<double> d = unique_ptr<double>(new double);
*d = 123.0;
// when d goes out of scope, the memory will be deleted as well

是的,文字123.0是一个常量,但它仍然没有改变p本身实际上并不指向任何地方的事实。“解引用运算符*获取指针指向的内容,如果指针没有指向您的任何地方。您的代码表现出未定义的行为。@Ke重新阅读有关指针的章节。指针指向的地址无效,因此无法通过它存储值。可能您混淆了有效的常量char*const p=123.0;
unique_ptr<double> d = unique_ptr<double>(new double);
*d = 123.0;
// when d goes out of scope, the memory will be deleted as well