第四章 数组和指针
1.数组的长度是固定的,数组一经创建,就不允许添加新的元素,指针则可以像迭代器一样用于遍历和检查数组中的元素。数组也是一种存储单一数据类型对象的容器,其中每个对象都没有单独的名字,而是通过他在数组中的位置对它进行访问。
2.和vector相比,数组:固定长度,无法知道size,无法预先知道需要多长的空间,很难为数组分配空间,速度比vector快
3.必须使用常量来初始化数组的维数。
4.显式初始化数组int ia[3] = {0, 1, 2};
如果这样写int ia[]={0, 1, 2};
编译器会根据列出的元素个数来确定数组长度。
5.初始化字符数组
6.不允许数组直接复制和赋值。
7.数组下标从0开始。
8.缓冲区溢出(buffer overflow)在引用了越出数组或者其他类似数据结构边界的元素时,就会导致这类错误。
9.指针保存的是一个对象的地址。而迭代器只能用来访问容器内的元素。
10.&取地址操作。
11.
12.未初始化的指针是无效的。很多运行时错误都源于使用了未初始化的指针。
13.如果使用未初始化的指针,会将指针中存放不确定值视为地址,然后操纵该内存地址中存放的位内容,使用未初始化的指针相当于操纵这个不确定地址中存储的基础数据。因此,在对未初始化的指针使用解引用时,通常会导致程序崩溃。
14.NULL在cstdlib中定义,其值为0。
15.void*指针。
他可以保存任何类型对象的地址。void表明该指针和地址值有关,但不清楚是哪种类型的指针。可以使用void(i)与另一个指针进行比较。(ii)向函数传递void指针或者从函数返回void指针(作为函数的参数和返回值)(iii)给另一个void*赋值
16.指针和引用比较:(i)定义引用没有初始化是错误的。(ii)赋值行为差异。给引用赋值就是赋值(因为引用是别名),指针赋值必须要先解引用再进行赋值(修改指向对象的值)。
17.指向指针的指针。指针本身也是可用指针指向的内存对象。
18.
19.
20.c++强制要求指向const对象的指针也必须具有const特性。这里的特性指的是指针只能指向const对象,并不是指针不能修改。const double *ptr
这里的const并不是针对指针类型的,而是指明指针指向的是const double类型。同样的,const void *ptr
可以指向任何类型的const对象。
21.但是可以让const指针指向非const对象,因此const指针可以理解为”自以为指向const的指针”
22.当然还存在不能修改的指针的类型。double *const ptr
.意思就是指向double的const指针。
23.const修饰指针,就是指针是const的。const修饰类型,就是指针指向const类型。
24.C风格字符串标准库函数
25.每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆,c语言程序使用malloc和free在自由存储区分配储存空间,c++语言则使用new和delete表达式实现相同的功能。
26.理论上,回收数组时缺少空方括号对,至少会导致运行时少释放了内存空间,从而产生内存泄露(memory leak)。
27.const char *s = str.c_str()
28.vector<int> vec(arr,arr+arr_size)
29.多维数组(通常指的多维数组其实就是数组的数组)。ia[row][col],行,列。
30.定义指向多维数组的指针,该指针指向的多维数组是数组的数组。
1
FIN 4.22/22.17