为什么指针变量必须先赋值,再使用
展开全部
为了安全访问。
当我们定义一个变量并访问它,比如 int a; a=10; 编译器帮助我们在内存中分配地址及空间(长度),在访问(使用)时我们只要在源代码中编写它的名字即可,根本不需要关心具体地址是多少,编译器在编译时自动会帮助我们在目标代码中转换为具体地址。
比如当编译器在为变量(对象)分配内存后就确定了具体地址是1000,则当前命名空间内凡是遇到a就会自动转换为1000,所有对a的操作都替换为对地址1000的操作,而且由于定义时已确定变量类型,编译器也知道应该以何种方式访问该地址,比如长度及数据编码(int是4字节,正数采用原码,负数采用补码)。
了解以上细节可以明白一个道理,直接使用地址(指针)操作数据,相对使用变量名操作数据更危险,因为这要求程序员非常明确在使用指针时所做的一切都必须“完全正确”,使用指针访问时,编译器等于将错误检查工作中的一部分工作交给程序员自己管理(这是指针方便高效的代价)。
因此养成初始化指针是一个简单良好的安全习惯,当指针暂时没有取得正确的地址前也必须初始化null,而在使用指针前也必须养成先判断再访问的习惯,比如 if (p){//操作指针},不要怕多打一个if感到麻烦。而如果指针未被赋值为正确的地址,指针变量中的地址是随机的,也许是上个临时变量或程序的残留,而这些值是不确定的,当这个值正好为某个系统敏感地址,你的程序很可能就会访问到错误的地址,大部分情况会引起程序崩溃甚至系统崩溃。
当你的程序大到一定规模后,如果某处指针访问出现错误,查错的难度很大,大到你也崩溃。
当我们定义一个变量并访问它,比如 int a; a=10; 编译器帮助我们在内存中分配地址及空间(长度),在访问(使用)时我们只要在源代码中编写它的名字即可,根本不需要关心具体地址是多少,编译器在编译时自动会帮助我们在目标代码中转换为具体地址。
比如当编译器在为变量(对象)分配内存后就确定了具体地址是1000,则当前命名空间内凡是遇到a就会自动转换为1000,所有对a的操作都替换为对地址1000的操作,而且由于定义时已确定变量类型,编译器也知道应该以何种方式访问该地址,比如长度及数据编码(int是4字节,正数采用原码,负数采用补码)。
了解以上细节可以明白一个道理,直接使用地址(指针)操作数据,相对使用变量名操作数据更危险,因为这要求程序员非常明确在使用指针时所做的一切都必须“完全正确”,使用指针访问时,编译器等于将错误检查工作中的一部分工作交给程序员自己管理(这是指针方便高效的代价)。
因此养成初始化指针是一个简单良好的安全习惯,当指针暂时没有取得正确的地址前也必须初始化null,而在使用指针前也必须养成先判断再访问的习惯,比如 if (p){//操作指针},不要怕多打一个if感到麻烦。而如果指针未被赋值为正确的地址,指针变量中的地址是随机的,也许是上个临时变量或程序的残留,而这些值是不确定的,当这个值正好为某个系统敏感地址,你的程序很可能就会访问到错误的地址,大部分情况会引起程序崩溃甚至系统崩溃。
当你的程序大到一定规模后,如果某处指针访问出现错误,查错的难度很大,大到你也崩溃。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询