引用与指针的区别
在c++中引用和指针很像,但是区别很明显。
相同点
1. 都是指向一块内存区域
2. 通过它可以改变对象的内容
不同点
1. 引用有类型,而指针没有,所以编译器可以通过引用来进行类型的安全检查。
2. 指针可以直接进行运算,进行偏移如p++;而引用不能。
3. 指针可以在任意的时候进行初始化,而引用必须在声明的时候。
4. 引用不能为NULL, 而指针可以。
malloc/free和new/delete的区别
在c语言中我们通过malloc/free来管理内存,但是c++中我们还可以使用new/delete来管理内存。那么既然c++兼容c语言,它们之间有什么区别?
相同点
1. 都可以进行内存管理,分配或释放内存
2. 都是在堆上进行内存分配
不同点
1. malloc/free是函数,而new/delete是操作符
2. malloc没有类型,只是根据给出的数据分配固定大小的字节;而new是有类型的,这样运行时可以进行类型检查。
3. malloc分配的内存必须再写一段程序进行初始化,而new分配的内存可以通过对象的构造函数进行初始化。
4.作为操作符new可以通过运行时来优化内存管理,而malloc只能通同修改不同的实现来进行优化。
扩展的问题
很多书籍告诫我们
不可混用malloc/free和new/delete
千万不要忘记释放动态分配的内存
在释放内存后对指针进行赋NULL(这个在c#或java这样的语言中也很重要)
要检查被分配内存后的指针是否为NULL
注意不要为栈内指针分配内存,因为你不知道什么时候该指针会丢失
对动态内存和数组在分配时初始化
sizeof和strlen
我们经常使用sizeof和strlen在我们的程序中,但是有多少人真正的理解它们呢?
对于sizeof
1. c语言的单目操作符
2. 用于计算类型或变量所占的内存字节数
3. sizeof和strlen的区别主要在于后者有判断标准,即以/0为结束标志;而sizeof只是单纯的计算字节数
4. 使用sizeof时,我们需要注意操作系统的位数,64位和32位在数据类型的字长上是不一样的。
5. 在32位系统下,用sizeof去计算指针永远是4个字节
6. 用sizeof求字符空间,必须加上/0
对于strlen
1. 求c类型的字符串长度
2. 以/0为结束标志,不包括/0
3. 对于unicode编码的字符串,不适用
数组和指针
正确的说一个是数组首地址和指针的关系。我们都知道数组的首地址和指针很像:
相同点
1. 可以做为基地址进行偏移运算
2. 都是存储地址内容
不同点
1. 指针的内容可以被修改,而数组的首地址不能。这个主要是因为指针是用户自己分配的,无论是在栈里还是在堆里它都要占用4个字节的空间,而数组首地址是编译器分配的,它虽然也占用4字节的空间,不过它是分配在系统栈中,修改权限由操作系统控制。
2. 数组必须有类型,而指针不一定。
3. 数组占用一块连续的内存空间,是作为一个整体出现,而指针只是一个地址链接,这点在使用sizeof的时候特别注意。