C/C++ 一点笔记(1)
定义和声明区别:
(1)定义分配内存,声明没有
(2)定义只能出现一次,而声明可以出现多次
(3)extern char a[] 与extern char a[100]等价,因为这里只是声明,不分配空间
(4)extern int a
extern 告诉编译器a这个名字已经在别的文件定义了,下面的代码使用的名字a是别的文件定义的
数组名的值:
(1)在绝大多数表达式中,数组名的值是指向数组第1个元素的指针。这个规则只有两个例外:sizeof返回整个数组所占用的字节而不是一个指针所占用字节;单目操作符&返回一个指向数组的指针,而不是一个指向数组第1个元素的指针的指针
高手写code的惯用法:
(1)将变量写到右边
例如: #define IDYES 6
int temp;
if(IDYES==temp)
{
//doing something
}
if(IDYES==temp) 较if(temp==IDYES)要好,因为当“==”误写成“=”时, if(IDYES=temp) 是编译通不过的,容易检查出来
(2)即使if只有一行code,也用使用{}
if(condition)
{
//doing something
}
两点小知识:
(1)判断输入字符的是否为合法整数:先将字符转换整数,再转换字符,比较转换前后字符,若相同,则是数字
(2)怎么将jpg图片格式快速转化为bmp图片格式:利用windows自带的画图工具转换——选中要转换的图片,右击,点编辑,在弹出的对话框中,点“文件”,“另存为”,在保存类型选择24位位图即可
引用和指针:
(1)指针可以为空,但是引用不能为空
(2)指针可以被赋值,但是引用只可以被初始化
(3)引用不可以被赋为另一个对象的别名,即另一个对象的引用
(4)如果想使一个变量记录不同对象的地址,那么就必须使用指针
(5)在堆中创建一块内存区域,必须要用指针来指向它,否则该区域就会变成无法方向的内存空间。当然我们也可以使用引用来引用指向内存空间的指针
(6)指针可以指向堆中空间,引用不可以指向堆中空间
(7)引用就是别名 int &mun=num; //&是引用运算符
(8)不能定义类的别名,但可以定义对象的别名
(9)引用就是常量,只能初始化,不能赋值
(10)空引用:指针进行删除操作后,需要将它们赋为空指针,引用却不需要这么做,这是因为引用是原来对象的别名,假设该对象存放在栈中,那么在对象超出作用域时别名会各对象一起消失。假如该对象存放在堆中,由于堆中内存空间必须使用指针来访问,因此用不着别名,即使定义一个该指针的别名,那么将指针删除并赋空后,该指针的别名中的地址也相应的赋空了
(11)this指针:
<1>this变量綮每一个对象的内存地址,然后通过间接访问运算符 -> 访问该对象的成员
<2>this变量记录每一个单独对象的内存地址,而this指针则指向每个单独的对象。因此不同的对象输出的this变量的内存地址也不同
<3>this指针的创建与删除由编译器来完成
引用容易犯的错误:
(1)引用是对象的别名,假如这个对象不存在了,使用这个对象的别名就会出现错误
(2)析构函数调用并析构某个对象后,只是告诉编译器这一块内存不再为某一个对象独占了,你可以访问它,别的对象或者变量也可以访问它并使用该内存区域存储它们的数据,但是在它们使用之前,存放在该内存区域的数据并没有删除
(3)只要在堆中创建一块内存空间,就会返回一个指向该空间的指针,我们一定不要弄丢该指针,假如该指针丢失,那么访堆中空间就会成为一块不可方向的区域,也就是程序员们经常说的内存泄漏。同样假如我们将存储在堆中的对象初始化给一个引用,那么当访对象被删除时,这个引用也就成了空引用,假如我们无意中使用了这个空引用的话,就会令程序出错
(4)在哪里创建,就在哪里释放
栈和堆:
(1)栈由于是系统自动分配,因此速度较快。但是缺点是可存放的空间较小,只在2M。假如我们要存放比较大的数据,栈显然是不行的,那么就得用堆了。堆是一大堆不连续的内存区域,在系统中由链表将它们串接起来,因此它可存放的空间可以很大。
(2)关于它们在执行效率以及申请方式上的区别,这里有两点基础不同:
<1>栈由系统自动分配内存,堆要程序员进行申请
<2>栈中空间比较小,只有2M,堆的上限是由系统中有效的虚拟内存来定的,因此获得空间比较大
(3)对象在堆与栈中的不同:
<1>一个存储在栈中的对象,如:Human Jack;在超出作用域时,比如说遇到右大括号,自动调用析构函数来释放该对象的所占用的内存
<2>一个存储在堆中的对象,如new Human;则需要要程序员自行对其所占用的内存进行释放,否则该对象所占用的内存直到程序结束才会被系统回收
(4)栈(stack)由编译器自动分配并且释放,一般存放函数的参数值,局部变量值等
(5)堆(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收
指针的常犯错误:
(1)删除一个指针后一定要将该指针设置为空指针,这是因为删除该指针只会释放它所指向的内存空间,而不会删除指针,因此这个指针还存在,并且它仍然会指向原来的内存空间,因此这时如果你再次尝试使用访指针,将会导致程序出错
(2)常量指针:
<1>int *const p;p=&a;(错误); int *const p=&a;(正确) 常用指针必须初始化
<2>常量指针的特性:常量指针自身不可以改变,但是它指向的目标却可以改变,无论目标是变量还是对象
(3)指向常量的指针: const int *p;