You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C++指针的疑问:为何需用&赋值?直接赋值ptr=var会怎样?

C++指针赋值问题解答

先看你给出的代码:

#include <iostream>

using namespace std;

int main() {
  int var;
  int *ptr;
  int val;

  var = 3000;

  // take the address of var
  ptr = &var;

  // take the value available at ptr
  val = *ptr;
  cout << "Value of var :" << var << endl;
  cout << "Value of ptr :" << ptr << endl;
  cout << "Value of val :" << val << endl;

  return 0;
}

为什么必须执行ptr = &var?

指针变量本质也是普通变量,只是它的存储内容是内存地址。声明int *ptr;时,ptr只是被分配了内存,但里面的内容是随机的垃圾值——C++不会自动让它指向任何变量的地址,必须通过显式赋值,把var的内存地址(&var是取变量地址的运算符)赋值给ptr,才能让ptr成为指向var的有效指针。

如果跳过这个赋值操作,ptr里的随机地址大概率指向程序无权访问的内存区域,后续执行*ptr这类操作时会直接导致程序崩溃。

直接写ptr = var会有什么结果?

var是int类型,值为3000;ptr是int*类型,要求存储的是内存地址。直接这么写属于类型不匹配的错误赋值:

  • 编译器会尝试把int类型的3000强制转换成int*类型,也就是把3000当作一个内存地址赋值给ptr;
  • 这个地址(十进制3000对应十六进制0xB70)几乎肯定是程序没有访问权限的内存区域,后续如果执行val = *ptr去读取该地址的值,会触发段错误(Segmentation Fault),直接导致程序崩溃;
  • 就算侥幸没崩溃,读到的也是该内存区域的无意义垃圾数据,而且编译时编译器通常会抛出“将int转换为指针可能丢失数据”的警告,这是完全不安全的错误操作。

内容的提问来源于stack exchange,提问作者mario villamil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:40:33