关于C++未被初始化的变量

初学C++的时候常常感觉变量初始化和赋值也没什么难的,无非就是int i=0这就是完事了,但有的时候看到别人写代码只是定义了一个变量int i,并没有为他赋初值,那时候我还以为定义的变量在未被初始化的时候都会被初始化0,但事实真的是这样吗?

1、局部变量

简单看一下:

#include <iostream>
int main() {
	int i;
    int *ptr;
	char c;
	std::cout << i;
	std::cout << c;
    std::cout << *ptr;
	system("pause");
}

我在main函数里面定义了三个变量,一个int,一个char,一个int型指针,然后运行,编译器反手就给了我三个错误

C4700:使用了未初始化的变量i

C4700:使用了未初始化的变量c

C4700:使用了未初始化的变量ptr

 至少我们不能再函数内使用未被初始化的变量,编译器不会给他们赋初值,此时的指针不知道该指向何处,然后就变成了一个野指针,我们在使用他的时候(我们就没法使用他啊哈哈哈)

2、指针

所以我们建议或者说要求指针必须去初始化他,让他指向一段明确的内存空间,如果我们不知道他将指向哪里,我们可以先这么初始化他

//(1)
int *ptr=NULL;
//(2)
int *ptr=nullptr;
//(3)
int *ptr=0;

 三种方法让他成为空指针,我建议用第二种,这是C++11新标准,用字面值nullptr初始化指针,nullptr可以被转换成任意其他的指针类型

现在的C++程序最好使用nullptr,同时尽量避免使用NULL;

所以最后我再说三句话:

初始化所有指针!

初始化所有指针!

初始化所有指针!

3、引用

咱们常听到引用就是取别名的意思,那那那那,你不给他初始化,我tm怎么知道引用是谁的别名啊

一旦引用初始化完成,引用将和他的初始值对象绑定在一起。因为无法另引用重新绑定一个其他对象,所以引用必须初始化,必须必须

所以,定义在函数体内的内置类型变量将不会被初始化,一个未被初始化的内置类型变量值是未定义的,如果试图拷贝以及其他形式访问此类值,将引发错误。所以我们一定要养成在赋值的时候就对其初始化的习惯呀!!

4、全局变量

函数体外呢,猜一猜?

不给你们猜了,他们都会被初始化为0,准确的说:

 在定义局部变量的时候,我们没有初始化他们,编译器也会去管一管他们,把他们初始化为0,这样至少我们在使用他们的时候不会报错

5、数组

int型

  1. 全局数组,未初始化时,默认值都是 0;
  2. 局部数组,初始化一部分时,未初始化的部分默认值为 0;
  3. 局部数组,未初始化时,默认值为随机的不确定的值;

char 型数组

  1. 全局数组,未初始化的部分,默认值为 ‘ ’ ;
  2. 局部数组,初始化一部分后,未初始化部分默认值为 ‘ ’ ;
  3. 局部数组,未初始化时,默认值不可预知。

double ,float 型数组

  1. 全局数组,未初始化时,默认值都是 0.0;
  2. 局部数组,初始化一部分时,未初始化的部分默认值为 0.0;
  3. 局部数组,未初始化时,默认值为随机的不确定的值;

bool 型数组

  1. 全局数组,未初始化时,默认值都是 0;
  2. 局部数组,初始化一部分时,未初始化的部分默认值为 0;
  3. 局部数组,未初始化时,默认值为 204;

这些就是数组的默认初始化的准则,是不是和我们上面讲的一样的,和内置类型的变量一样,如果在函数内部定义了某种内置类型的数组 ,那么默认初始化会令数组含有未定义的值

全局变量的数组当然全被初始化为0

我再补充一下吧

Q:什么是初始化一部分,什么是未初始化

初始化一部分:

#include <iostream>
int main() {

	int c[6] ={1,2,3};//我只初始化了三个数字,并没有到达上限,未完全初始化
	int b[6] = {};//我一个都没初始化,但是我确实想要初始化了

	for (int i = 0; i < 6; i++)
	{
		std::cout << b[i];
	}
	system("pause");
}

输出都是0

未初始化:

#include <iostream>
int main() {

	int b[6];//我只是创了个数组,但是只是定义,只是定义

	for (int i = 0; i < 6; i++)
	{
		std::cout << b[i];
	}
	system("pause");
}

随机输出

所以呢,为了不让随机初始化,我们最好给数组初始化,如果我们没什么想法,那么可以int a[6]={};这个是很好的,至少都被初始化0,是明确的,具体的

好啦,就这么多吧,但愿我讲的明白。。。祝大家代码都可以一遍过!加油!

参考书籍:《C++ primer 中文版》第五版 

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听风逝夜al

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值