【C/C++】二维数组与指针数组

文章介绍了C++中的二维数组基础,通过代码示例展示了如何定义和操作二维数组,特别是指针在数组中的应用。此外,还讨论了面向对象编程中的多态性,以职工类为例,说明如何使用父类指针指向不同子类对象,实现动态绑定。在处理不定长度的员工数组时,文章提到了使用二级指针在堆区动态分配内存的方法。
摘要由CSDN通过智能技术生成

二维数组的基础概念 

 代码:

#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函数中定义指针数组$name$。它有5个元素,其值分别是字符串 "BASIC", "FORTRAN", "C++", "Pascal", "COBOL" 的起始地址。

        $name$的每一个元素是一个指针型数据(其值为地址),分别指向不同的字符串。

    数组名是数组首元素的地址。又因为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类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值