C++学习笔记之数据类型(2)数组、向量、指针
自学C++有时总会提不起干劲,搁置几个月后又会忘记之前比较重要的点,因此我开了这个学习笔记系列,希望在自己的学习过程中能督促我自己的学习,同时遇到问题时希望可以借助该系列博客复习、提醒,也希望能帮助一些其他的C++学习者。1.
目录
数组(Arrays)
数组是数目固定的、类型相同的若干个变量的有序集合。数组的元素个数、初始化基本与C语言一致。关于数组的默认值,没有初始化的静态数组(static)中的元素会被清零。而局部数组(即在函数内部定义的数组)的元素值是不确定的。
C++也允许使用二维数组,甚至多维数组。例如三维数组float a[2][3][4];
共有 2∗3∗4=24 2 ∗ 3 ∗ 4 = 24 个元素,可以看做是以二维数组为元素的数组。
向量(Vectors)
vector是向量类型,是一种对象实体,有值,可以看作是变量。向量可以容纳许多其他类型的相同实体,比如若干个整数,称其为容器。使用时,需要包含头文件 vector。
定义方式可以为:
vector<int> a(10); //定义了10个整数元素的向量,但没有给出初值
vector<char> b(10, 'a'); //顶一个一个10个char型元素的向量,并且每个初值都是‘a’
vector<char> c(b); //通过一个现成的向量b来创建一个新变量c
vector<char> d(b.begin(), b.begin() + 3); //创建一个向量,值为b中的第0个到第2个(共3个)值
int e[7] = { 1, 2, 3, 4, 5, 6, 7 };
vector<int> va(e, e +7); //创建的向量通过数组获得初值
b.begin()、b.end()表示向量的起始元素位置和最后一个元素之外的元素位置。向量元素位置也属于一种类型,称为遍历器。遍历器表示元素的位置,也可以在容器内前后挪动。向量中的遍历器类型为vector<int>::iterator
。遍历向量中的所有元素的话,可以由下面两种方式:
show me the money!
指针
指针变量就是专门用来存放地址(即指针)的变量。此处要把指针和指针变量区分开。变量的指针就是变量的地址,用来存放变量地址的变量是指针变量。
一个变量的指针有两个要素,一个是变量的地址,另一个是 它指向的数据类型。一个指针变量只能指向同一类型的变量。
当指针指向数组的一个元素时,就可以通过指针的加减快速的遍历完所有的数组元素。如:
int a[10];
int i,*p=a; //使指针变量p指向a[0]
for (i = 0; i < 10; i++)
cin >> *(p+i);
for (p = a; p < (a+10); p++) //p++即指向的元素地址++
cout << *p << " ";
cout << endl;
使用指针可以优化执行的效率。
使用指针访问变量等同于是在间接寻址,我们还可以使用指向指针的指针来实现“二级间址”甚至更高的级数,但实际中很少使用超过“二级间址”的,级数越高的时候,操作和可读性都会越来越差,也更容易出现混乱和错误。
当一个数组的元素都是指针类型数据时,该数组称为指针数组。另外还有const指针(即常量指针)、void指针(即无类型指针)等。但需要注意的是:指针变量可以有空值,即该指针不指向任何变量,但未被赋值的变量是很危险的。
如:int *p;
p=NULL; //NULL在头文件iostream中已经被定义为整数0
如果p未被赋值,它可能指向某一个未知的单元,是很危险的。
- 教材:C++程序设计教程(清华大学出版社第二版)。 ↩