zoukankan      html  css  js  c++  java
  • 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;

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

  • 相关阅读:
    Leetcode 204. Count Primes
    Leetcode 263. Ugly Number
    Leetcode 202. Happy Number
    Leetcode 258. Add Digits
    Leetcode 23. Merge k Sorted Lists
    BAT 批处理脚本教程
    入门训练 序列求和
    JAVA学习:方法
    大小之差
    java中length,length(),size()区别
  • 原文地址:https://www.cnblogs.com/ly0311/p/2687750.html
Copyright © 2011-2022 走看看