数组
①显式初始化的数组不需要制定数组的维数值;
int arr[] = {0,1,2}; //[]中维数值可以省略
②vector使用vector::size_type作为下标的类型,数组下标类型是size_t;
int main()
{
const size_t array_size = 7;
int ia1[] = {0,1,2,3,4,5,6};
int ia2[array_size]; //使用size_t类型数值来定义数组大小
for (size_t ix = 0; ix != array_size; ++ix) //从ia1复制数据到 ia2
ia2[ix] = ia1[ix];
return 0;
}
指针
①指针相减用标准库类型ptrdiff_t(signed整型)数据储存(在cstddef头文件中定义)
#include<cstddef>
int ia[] = {0, 2, 4, 6, 8};
int *ip = ia;
int *ip2 = ip + 4;
ptrdiff_t n = ip2 - ip1;
//这个数值为signed整型数据,表示位置关系
②指针下标
int *p = &a[2];
于是 p[1] == *(p + 1) //相当于a[3]
p[-2] == *(p - 2) //相当于a[0]
③指向const 对象的指针
指向const对象的指针必须具有const特性(即使木有,也默认有了)
const double pi = 3.14;
double pi2 = 2.7;
double *ptr = π //错误,pi具有const特性
const double *cptr = π //ok,
const double *cptr2 = &pi2; //ok,但不能通过*cptr2修改pi2的值.
PS:这种指针可以更改指向,不可更改所指向的值.
④const指针
具有const特性的指针,定义时需要初始化,并且不能更改.
int Numb = 0;
int *const curErr = &Numb; //一旦初始化,指向不能更改.
PS:这种指针不可更改指向,但可以更改所指向的非const对象的值.
⑤指向const对象的const指针.(③+④)
const double *const pi_str = π
PS:既不能更改指向,也不能更改所指向的值.
动态创建数组(使用new和delete)
一,定义与初始化
int *pia = new int[10]();
//创建含有10个元素的数组,在数组后的圆括号()是对编译器初始化数组的要求,所有元素置为0.
二,动态分配空数组.
size_t n = get_size(); //get_size()是一个获取用户提供值的函数
int *p = new int[n]; //动态创建维数值为n的int数组并返回数组第一个元素的地址,保存于p指针中
for(int*q = p; q != p+n; q++)
{} //对该数组进行操作
三,动态空间释放.
delete [] pia;
//此处的方括号[]很重要,告诉编译器所释放的是一个数组,若缺少,内存只会释放数组的一个元素的空间,从而产生内存泄漏(memory leak).
C++ PRIMER中 C风格的字符串 也是数组一大知识点,但它告诉我们要尽量避免使用C风格的字符串,
应该尽量使用c++所提供的标准库string类型.不仅简单,容易理解,而且不易出错.个人还是偏向使用string类型对象,
所以本篇就省略对 C风格的字符串 的相关笔记, 有需要时再作整理.