关于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
相关产品推荐
相关产品推荐

