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;

 

 

诗意般生活 活出生命的精彩

posted @ 2012-09-16 19:26  liuyi_001  阅读(157)  评论(0编辑  收藏  举报