二维数组的基础概念
代码:
#include<iostream>
using namespace std;
int main() {
char **p; //定义指向字符指针数据的指针变量p
char * name[] = {"BASIC", "FORTRAN", "C++", "Pascal", "COBOL" }; //定义指针数组
p = name + 2; //见下图中的p的指向
cout << *p << endl; //输出name[2]指向的字符串
cout << **p << endl; //输出name[2]指向的字符串中的第1个字符
return 0;
}
运行结果:
C++
C
程序分析:
在main函数中定义指针数组。它有5个元素,其值分别是字符串 "BASIC", "FORTRAN", "C++", "Pascal", "COBOL" 的起始地址。
的每一个元素是一个指针型数据(其值为地址),分别指向不同的字符串。
数组名是数组首元素的地址。又因为name是一个二维数组,
因此它的每一个元素都是一个一维数组。即:
二维数组名: name = &name[0];
一维数组名: name[2] = &name[2][0];
p = name + 2 = &name[0] + 2 = &name[2];
*p = *(name + 2) = *&name[2] = name[2];
**p = *name[2] = *(&name[2][0]) = name[2][0];
由于 *p 代表 name[2] ,它指向字符串 “C++”,或者说在 name[2] 中存放了字符串 “C++” 第一个字符的地址,因此“cout << *p << endl;”就从第一个字符开始输出字符串 “C++”。第二个cout中的 **p 是 *p (值为 name[2] )指向的 "C++" 第一个字符元素的内容,即字符 “C”。因此 “cout << **p << endl;”输出字符 “C”。
多态的二维数组实例
//职工抽象基类
class Worker
{
public:
//显示个人信息
virtual void showInfo() = 0;
//获取岗位名称
virtual string getDeptName() = 0;
int m_Id; //职工编号
string m_Name; //职工姓名
int m_DeptId; //职工所在部门名称编号
};
//员工类
class Employee :public Worker
{
public:
//构造函数
Employee(int id, string name, int dId);
//显示个人信息
virtual void showInfo();
//获取职工岗位名称
virtual string getDeptName();
};
//经理类
class Manager :public Worker
{
public:
Manager(int id, string name, int dId);
//显示个人信息
virtual void showInfo();
//获取职工岗位名称
virtual string getDeptName();
};
//老板类
class Boss :public Worker
{
public:
Boss(int id, string name, int dId);
//显示个人信息
virtual void showInfo();
//获取职工岗位名称
virtual string getDeptName();
};
原本 new Employee(), new Manager(), new Boss() 的返回值分别是 Employee* , Manager*,Boss* 类型的指针,但是利用多态可以用父类指针指向子类对象。
void test()
{
Worker * worker = NULL;
worker = new Employee(1, "张三", 1);
worker->showInfo();
delete worker;
worker = new Manager(2, "李四", 2);
worker->showInfo();
delete worker;
worker = new Boss(3, "王五", 3);
worker->showInfo();
delete worker;
}
用户在批量创建时,可能会创建不同种类的职工
如果想将所有不同种类的员工都放入到一个数组中,可以将所有员工的指针维护到一个数组里
如果想在程序中维护这个不定长度的数组,可以将数组创建到堆区,并利用Worker **的指针维护
Worker** pp = new Worker* [5] : new一个 5 个元素的数组,每个元素的类型是 Worker*,返回值 pp 是一个Worker** 类型的数据。
这里的worker **是一个二级指针,用来指向指针的指针,语法是 数据类型 ** 变量名。第一个*访问NEW出的空间数据,第二个*访问数组中的数据。
注意:第一个星访问数组首地址,第二个可访问数组i号数据地址。若只用一个星,则只能访问到数据首地址,改不了数组中的数据,Worker* 看成一个整体,类比成int类型。