c++指针和自由存储空间

指针和自由存储空间#

  • 打印地址时使用16进制表示
  • 使用指针比使用数组好的一点是数组大小在编译阶段就要确定好,而指针指向的空间大小可以在运行阶段确定好。可以使得程序更加灵活。
  • int * ptr;表示声明一个指针。
  • 每声明一个指针都需要在前面加*。
  • 指针变量不仅仅是一个指针,而且是一个指向特定类型的指针。
  • 指针变量本身的长度是相同的。例如:char 和 double类型的指针长度相同。
  • c++创建指针时,只分配地址所占用的内存。而不分配指针所指向的数据的内存。数据的内存需要自己显式的分配。
  • 在操作指针指向的数据之前,先为指针初始化一个合适的确定的地址。
  • c++中如果将一个int型值直接赋给指针类型(就算那个值很像地址值),编译器将显示类型不匹配的错误信息。如果要将int值赋给一个指针使用应当使用强制类型转换。
int * pt;
pt = (int *) 0xB8000000;

指针在运行阶段的内存空间分配##

  • c语言中使用malloc()分配内存。
  • c++中使用new分配内存。
    • new会找到一个长度正确的内存块,并返回该内存的地址。
    • int * pn = new int;
    • new分配内存卡通常与常规变量分配的内存块不同。
    • 常规变量存储在被称为栈的内存区域中,new分配的内存在堆中。
    • 计算机可能因为没有足够的内存而无法满足new请求。这种情况下new将引发异常。
  • c++中使用delete释放内存。
    • delete可以释放new分配的内存。
    • 可以使内存被使用完后能够将其归还到内存池。
    • int * ps = new int;
    • delete ps;
    • 这将会释放ps指向的内存,但不会删除ps本身。
    • 释放完指针指向的内存后,可以将指针指向另一个新分配的内存。也可以指向NULL,否则将可能出错。因为释放后的内存可能在其他地方被使用。
    • 不可以用delete释放声明变量所分配的内存。
    • 对空指针使用delete是安全的。
  • 一定要配对的使用new和delete,否则可能出现内存泄漏
  • 使用new创建动态数组
    • int * psome = new int [10];
    • new返回第一个元素的地址。
    • 对于使用new创建的数组,应该使用delete [] psome;释放。
  • 使用new和delete时应该遵循一下原则:
    • 1 不要使用delete释放不是new分配的内存。
    • 2 不要使用delete释放同一块内存两次。
    • 3 如果使用new []为数组分配内存,应该使用delete []释放。
    • 4 如果使用new为一个实体分配内存,应该使用delete释放。
    • 5 对空指针使用delete是安全的。
  • 使用下标可以访问数组中的元素
    • int * p = new int [3];
    • p[0] = 1;
    • p[1] = 2;
    • p[2] = 3;
  • 指针和数组的不同
    • 不能修改数组名的值。指针是变量,可以修改它的值。
    • sizeof()参数为数组时得到数组长度,参数为指针时得到的是指针的长度(即使指针指向一个数组)。这种情况下c++不会将数组名解析为地址。
  • 指针算术
    • 什么类型的指针+1后地址增加的量相当于该类型的字节数。
    • 例如 short 的指针+1后,如果系统对short使用2字节存储,则指针值将增加2。
  • 数组名被解析为该数组第一个元素的地址。对数组使用取地址时得到的是整个数组的地址。虽然地址数值一样,但是前一个是一个2字节内存块的地址,而后一个是2*n。
  • short (*pas)[20] = &tell ; 表示一个数组指针。指向一个含有20个元素的数组的指针。

指针和字符串##

  • 在cout和多数c++表达式中,char数组名,char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。

  • 在将字符串读入程序时,应使用已分配的内存地址。该地址可以是数组名,也可以是new初始化过的指针。

  • 如果给cout提供一个指针,它将打印地址。如果提供一个char * ,则打印指向的字符串。如果要打印该字符串的地址,那么应该将char * 强制转为另一种指针类型,如int * 。

      cout << animal << "at" << (int * ) animal << endl;
    
  • 使用大型临时数组,接收输入字符串。然后将其拷贝到应该new出来的char * 中。可以节省内存。

posted @ 2019-11-29 23:02  yangzixiongh  阅读(444)  评论(0编辑  收藏  举报