指针数组
一个数组的元素可以是各种已经定义的数据类型,当数组元素是指针类型时,称为指针数组。
指针数组的定义形式为
类型 *标识符[表达式];
例如 char *ps[10];
double *ps[7];
指向数组的指针数组:
#include <iostream>
using namespace std;
int main()
{
double aa[2]={2,1};
double bb[2]={3.2,77},
cc[2]={7.8,8.0};
double *pf[3]; //定义指针数组
pf[0]=aa; //取数组地址,将指针数组指向数组
pf[1]=bb;
pf[2]=cc;
for (int i=0;i<=2;i++)
{for(int j=0;j<=1;j++)
cout<<*(pf[i]+j)<<"\t";
cout<<"\n";
}
}
注:指针数组的类型必须与数组的类型相同,否则会报错,还有指针数组遍历时应注意双层for循环的书写
指向函数的数组:
#include <iostream>
using namespace std;
void main()
{
double Square1(double l)
{return 4*l;}
double Sprt1(double r)
{return 3*r+r;}
double(*pf[2])(double);//指针数组定义,看清楚各部分定义规则
double x=3.14;
pf[0]=Square1;
pf[1]=Sprt1;
for(int i=0;i<2;i++)
cout<<(*pf[i])(x)<<"\n";
}
指针数组的类型应该与函数的类型相同,指针数组的形参也应该与函数的形参类型相同,如上所示
异质链表
为了将不同类的对象统一组织在一起,可以定义一个抽象类指针数组或异质链表,由于这个表中具有不同类类型元素,但他们有共同的积累,称为异质链表
其实来说,异质链表可以说是和指针数组非常像,关键区别在于字符指针是存放在一片连续存储空间的字符序列的首地址,C加加根据串结束符"\0"行动令结束串值,
而基类指针指向派生类对象,通过指针当前所指对象的类型解释对象。
如下所示为一段异质链表的书写:
void test2()
{ Employee * employ[6] ;
int i;
employ[0] = new Manager( 10135, "Cheng ShaoHua", 1200 ) ;
employ[1] = new Manager( 10201, "Yan HaiFeng",5300 ) ;
employ[2] = new HourlyWorker( 30712, "Zhao XiaoMing", 5, 8*20 ) ;
employ[3] = new HourlyWorker( 30649, "Gao DongSheng", 4.5, 10*30 ) ;
employ[4] = new PieceWorker( 20382, "Xiu LiWei", 0.5, 2850 ) ;
employ[5] = new PieceWorker(20496, "Huang DongLin", 0.75, 1850) ;
cout << setiosflags(ios::fixed|ios::showPoint) << setprecision(2) ;
for( i = 0; i < 5; i ++ )
employ[i] -> print() ;
动态异质链表
动态异质链表与之前写的c语言链表大同小异,完全在c语言链表的基础上将指针指的对象改为一个类,下面是一个实例:(c++课本例题)
/Employee.h
class Employee
{ public:
Employee(const long,const char* );
virtual ~Employee();
const char * getName() const;
const long getNumber() const;
virtual double earnings() const=0;
virtual void print() const;
Employee *next ; //关键,说明指针
protected:
long number;
char * name;
};
void AddFront( Employee * &h, Employee * &t ) // 在表头插入结点
{ t->next = h ; h = t ; }
void test3() // 测试函数
{ Employee * empHead = NULL , * ptr;
ptr = new Manager( 10135, "Cheng ShaoHua", 1200 ); // 建立第一个结点
AddFront( empHead, ptr ) ; // 插入表头
ptr = new HourlyWorker( 30712, "Zhao XiaoMing", 5, 8*20 ); // 建立第二个结点
AddFront( empHead, ptr ); // 插入表头
ptr = new PieceWorker ( 20382, "Xiu LiWei", 0.5, 2850 ); // 建立第三个结点
AddFront( empHead, ptr ) ; // 插入表头
ptr = empHead ;
while( ptr ) { ptr -> print() ; ptr = ptr -> next ; } // 遍历链表,输出全部信息
ptr = empHead ;
while( ptr ) // 遍历链表,输出姓名和工资
{ cout << ptr -> getName() << " " << ptr -> earnings() << endl ;
ptr = ptr -> next ;
}
}
void AddFront( Employee * &h, Employee * &t ) // 在表头插入结点
{ t->next = h ; h = t ; }
void test3() // 测试函数
{ Employee * empHead = NULL , * ptr;
ptr = new Manager( 10135, "Cheng ShaoHua", 1200 ); // 建立第一个结点
AddFront( empHead, ptr ) ; // 插入表头
ptr = new HourlyWorker( 30712, "Zhao XiaoMing", 5, 8*20 ); // 建立第二个结点
AddFront( empHead, ptr ); // 插入表头
ptr = new PieceWorker ( 20382, "Xiu LiWei", 0.5, 2850 ); // 建立第三个结点
AddFront( empHead, ptr ) ; // 插入表头
ptr = empHead ;
while( ptr ) { ptr -> print() ; ptr = ptr -> next ; } // 遍历链表,输出全部信息
ptr = empHead ;
while( ptr ) // 遍历链表,输出姓名和工资
{ cout << ptr -> getName() << " " << ptr -> earnings() << endl ;
ptr = ptr -> next ;
}
}