1 数组 是用来保存 单一类型 的一组对象 的容器, 数组的长度固定,一经定义便不能更改。
2 数组定义:
数组是一种复合数据类型,由 类型名 标示符 维数 组成。
数组的 元素 可以是 内置数据类型 和 类类型, 但是不能是引用类型。
数组的 维数 必须是 大于或等于一的 常量表达式。
字面值常量,枚举常量,常量表达式定义的 const 对象。
3 数组的初始化:
1 在函数体外定义内置类型数组,其元素默认初始化为0;
2 在函数体内定义内置类型数组,气元素不进行自动初始化;
3 若元素为类类型,则无论数组定义在何处,元素将调用默认构造器初始化,无默认构造器的类类型元素必须显示调用初始化式。
4 不允许数组间接复制:
int a[] = {1, 2, 3};
int b[](a); //error
int c[3];
c = a; //error
5 数组的操作:
1通过下标操作数组元素:
int main()
{
const size_t array_size = 10;
int array[array_size];
for (size_t index = 0; index < array_size; ++index)
array[index] = index;
return 0;
}
6 指针:
指针 是一种用来保存 对象地址 的复合类型。指针时数组的迭代器。
7 指针初始化:
int *pi = 0; //初始化空指针,通过0值常量表达式
int *p = NULL; //初始化空指针
int val = 1024;
int *ptr = &val; //初始化指针,通过地址
#对位初始化的指针进行解引用操作将会导致程序奔溃
#编译器可以检测出 0 值的指针
8 void 类型指针:
void类型指针 是 特殊的指针,它可以用来保存任意类型对象的地址。
int val = 1024;
void *vptr = &val;
void类型指针由于不确定指针的类型,因此不能通过它直接操作指向的对象,
必须进行强制类型转换。
9 指针操作:
解引用操作:
cout << *ptr; //直接操作指向的对象
ptr = p; //指针复制操作,改变指针关联对象
10 指针和引用的区别:
引用必须初始化,且不能在定义后改变绑定对象;
给引用赋值将改变关联对象的值,给指针复制将改变指针的关联对象;
不存在引用的引用,但是存在指针的指针和指针的引用。
11 通过指针访问数组:
ptrdiff_t distance = ptr1 - ptr2; //同一数组的两个指针可以计算距离
#允许数组的指针计算 数组的超出末端地址,但是不能对超出末端地址进行解引用,
#也不允许计算超出末端元素之后 和 数组首元素之前 的地址。
12 指针 和 const :
指向const对象的指针:
const int *ptr = &val;
int const *ptr1;
ptr1 = &val;
指向const对象的指针表示 不能通过该指针改变 指向对象的值,但是指针
本身是可以改变关联对象的。
const 指针:
int * const ptr = &val;
此时 const 修饰指针本身,即此时该指针是一个 指针常量,定义时必须初
始化,且不能在初始化后 改变其 关联对象。
#允许把非const对象绑定到 const 指针, 但是不能 把 const对象绑定到 非const指针
char * message = "hello world!"; //error
13 动态数组:
动态数组允许 数组的维数 在运行期间确定。定义的动态数组将一直存在,直至显式释放。
动态数组的定义:
int *ptr = new int[10]; //无需定义数组名称,将返回数组的首元素地址
int *ptr = new int[10](); //在定义时跟上圆括号表示将数组元素初始化成默认值
#动态数组 的初始化 只能将元素初始化成默认值。
const 对象的动态数组:
const int *ptr = new const int[10]();
释放动态数组的空间:
delete[] ptr;
14 数组 指针 和 容器 迭代器 的兼容:
1 可以直接用字符串初始化string对象:
string s("hello");
2 可以直接连接字符串和string对象:
s += "data";
3 可以将string对象转换成 字符串:
char *c = s.c_str();
#c_str()返回的数组并不一定有效,因为对s的操作可能改变其值,最好将它复制未副本。
4 可以用数组的指针初始化容器:
int array[10];
vector<int> vec(array, array+10); //此时array是数组的首元素地址,array+10是数组超出末端元素地址。
2 数组定义:
数组是一种复合数据类型,由 类型名 标示符 维数 组成。
数组的 元素 可以是 内置数据类型 和 类类型, 但是不能是引用类型。
数组的 维数 必须是 大于或等于一的 常量表达式。
字面值常量,枚举常量,常量表达式定义的 const 对象。
3 数组的初始化:
1 在函数体外定义内置类型数组,其元素默认初始化为0;
2 在函数体内定义内置类型数组,气元素不进行自动初始化;
3 若元素为类类型,则无论数组定义在何处,元素将调用默认构造器初始化,无默认构造器的类类型元素必须显示调用初始化式。
4 不允许数组间接复制:
int a[] = {1, 2, 3};
int b[](a); //error
int c[3];
c = a; //error
5 数组的操作:
1通过下标操作数组元素:
int main()
{
const size_t array_size = 10;
int array[array_size];
for (size_t index = 0; index < array_size; ++index)
array[index] = index;
return 0;
}
6 指针:
指针 是一种用来保存 对象地址 的复合类型。指针时数组的迭代器。
7 指针初始化:
int *pi = 0; //初始化空指针,通过0值常量表达式
int *p = NULL; //初始化空指针
int val = 1024;
int *ptr = &val; //初始化指针,通过地址
#对位初始化的指针进行解引用操作将会导致程序奔溃
#编译器可以检测出 0 值的指针
8 void 类型指针:
void类型指针 是 特殊的指针,它可以用来保存任意类型对象的地址。
int val = 1024;
void *vptr = &val;
void类型指针由于不确定指针的类型,因此不能通过它直接操作指向的对象,
必须进行强制类型转换。
9 指针操作:
解引用操作:
cout << *ptr; //直接操作指向的对象
ptr = p; //指针复制操作,改变指针关联对象
10 指针和引用的区别:
引用必须初始化,且不能在定义后改变绑定对象;
给引用赋值将改变关联对象的值,给指针复制将改变指针的关联对象;
不存在引用的引用,但是存在指针的指针和指针的引用。
11 通过指针访问数组:
ptrdiff_t distance = ptr1 - ptr2; //同一数组的两个指针可以计算距离
#允许数组的指针计算 数组的超出末端地址,但是不能对超出末端地址进行解引用,
#也不允许计算超出末端元素之后 和 数组首元素之前 的地址。
12 指针 和 const :
指向const对象的指针:
const int *ptr = &val;
int const *ptr1;
ptr1 = &val;
指向const对象的指针表示 不能通过该指针改变 指向对象的值,但是指针
本身是可以改变关联对象的。
const 指针:
int * const ptr = &val;
此时 const 修饰指针本身,即此时该指针是一个 指针常量,定义时必须初
始化,且不能在初始化后 改变其 关联对象。
#允许把非const对象绑定到 const 指针, 但是不能 把 const对象绑定到 非const指针
char * message = "hello world!"; //error
13 动态数组:
动态数组允许 数组的维数 在运行期间确定。定义的动态数组将一直存在,直至显式释放。
动态数组的定义:
int *ptr = new int[10]; //无需定义数组名称,将返回数组的首元素地址
int *ptr = new int[10](); //在定义时跟上圆括号表示将数组元素初始化成默认值
#动态数组 的初始化 只能将元素初始化成默认值。
const 对象的动态数组:
const int *ptr = new const int[10]();
释放动态数组的空间:
delete[] ptr;
14 数组 指针 和 容器 迭代器 的兼容:
1 可以直接用字符串初始化string对象:
string s("hello");
2 可以直接连接字符串和string对象:
s += "data";
3 可以将string对象转换成 字符串:
char *c = s.c_str();
#c_str()返回的数组并不一定有效,因为对s的操作可能改变其值,最好将它复制未副本。
4 可以用数组的指针初始化容器:
int array[10];
vector<int> vec(array, array+10); //此时array是数组的首元素地址,array+10是数组超出末端元素地址。