"C++ Primer" 读书笔记 第四章 数组与指针

  通常我们使用vector而不用数组,使用string而不用字符串数组。

  关于数组和指针我们只需要知道:

  • 用字符串字面值初始化数组,字面值最后的一个'\0'也会占用书序长度,小心越界;
  • 数组的size无法得到,只能在定义处查到;
  • 数组不能直接整体赋值(如 int a[] = a0[];);
  • 如果要把一个数组的值赋给另一个数组,请用for循环为每个元素赋值;
  • 取地址操作符&只能作用于左值;对一个左值(下标操作或解引用操作)使用&将返回这个左值的地址:
int a0 = {1,2,3};
vector<int> a(&a0[0], &a0[2]); // 数组的值拷贝给vector,
  • *与变量名靠拢比较好;
  • void*指针可以指向任何对象,但是支持的操作很有限:与另一个指针比较、作为函数形参或者返回值(具体使用场景?)
  • 引用与指针的区别:引用只能指向某个对象,必须进行初始化;给引用赋值是给对象赋值,而给指针赋值将指向另一个对象;
  • 在表达式中出现的数组名本质是一个指针,指向数组的第一个元素;
  • 指针同样可以进行算术操作:
int a0 = {1,2,3};
vector<int> a(a0, a0+2); // 数组的值拷贝给vector

  

  下面我们了解一下动态数组:

  • 程序执行过程中动态分配内存的对象都存放在free store/heap(堆)中。在堆中分配空间,C语言中使用malloc()/free()函数,C++中使用new/delete关键字
  • 定义数组变量的三要素:元素类型,数组名,数组维数;而动态分配数组时,无须定义数组名,new表达式将返回指向数组的第一个元素的指针:
int *p = new int [10]; // 通过指针访问该数组

     在堆区创建的数组对象是没有名字的,只能通过指针直接访问堆中的对象。

  • 动态数组的初始化:
  • 如果数组元素是类类型,则默认构造函数初始化之;内置类型则不会被初始化,只有加圆括号,如下所示,才会普通地初始化:
int * p = new int[10](); // 无法初始化为指定值
  • 动态空间的释放
delete [] p;

 

posted @ 2019-05-29 16:30  LiaoQian1996  阅读(62)  评论(0编辑  收藏  举报