26C++指针和类
引言
一天,格莱尔想把从尼克家借来的书还给尼克,但是尼克不在家,于是把书放到了书架第3层的最右边,并写了一张留言条放在桌上,上面写着:我还你的书放在书架第3层最右边。当尼克回来后,看到这张留言条就知道书在哪了。这张留言条有什么作用呢?它就相当于一个指针,上面的内容不是书本身,而是书的位置,尼克通过留言条(指针)找到了格莱尔还回来的书。
一、地址与指针
指针是一个功能强大的利器,正确灵活地运用它,可以使程序简洁、紧凑、高效。指针是一个指示器,它告诉程序可以在内存的哪块区域找到数据,让我们先来看一个程序吧。
本程序中,定义了整型变量a,在编译时,系统会开辟一块内存单元用来存放a的值,对a的存取操作就是直接到这个内存单元存取。内存单元的位置叫地址,存放a的值的地址可以用取地址操作符“&”对a运算得到:&a。
同时,定义了一个指针变量p,p将指向一个内存单元,里面将存放一个内存地址。现赋值为存放变量a的内存单元的地址。
内存单元的地址是按字节编码的,即每一个字节都有一个不同的地址。编译系统会根据程序中定义的变量类型,为每个变量分配一定长度的空间。在Dcv-C++中为整型变量分配4个字节,假设系统把地址为101-104的4个字节分配给变量a,把地址为105~108的4个字节分配给指针变量p,如下图所示。
一个变量的地址称为该变量的指针,用来专门存放地址的变量是指针变量。地址是内存中的“门牌号”,是固定不变的,而指针变量的值是可以改变的,因为任何变量的地址都可以赋值给同类型的指针变量。
练习
(1) 设有定义语句“int x,*p=&x;”,则下列表达式中错误的是( )。
A.*(&x) B.&(*x) C.&(*p) D.*(&p)
(2) 阅读程序写结果
#include <iostream>
using namespace std;
int main()
{
char c1,*p1;
c1='A';
p1=&c1;
(*p1)++;
cout<<c1<<endl;
return 0;
}
输出:_____________
(3)完善程序
格莱尔家有一个三岁的小弟弟,格莱尔经常教他数数,请编一程序输出1-100的整数,辅助格莱尔教弟弟数数。
#include <iostream>
using namespace std;
int main()
{
int i,*p;
p=__________;
for(*p=1; *p<=100;(*p)++)
cout<<__________<<endl;
return 0;
}
二、指针与数组
风之巅小学每年都要进行大队委的选举,无论老师还是学生都只有一张选票。试编一个投票程序,有n位同学参加选举,有5位候选人,分别用1~5来表示,0表示弃权。投票后输出5位候选人的票数。
#include <iostream>
using namespace std;
const int MAX=5; //候选人的人数
int count(int b[],int n)
{
int x;
for(int i=1;i<=n;i++)
{
do
{
cout<<i<<':';
cin>>x;
}while(x<0||x>MAX);
b[x]++;
}
}
int main()
{
int a[MAX+1],i,n ,*p; //a[0]统计弃权的票数
cout<<"请输入实到人数:";
cin>>n;
for(p=a;p<=(a+MAX);p++)
*p=0;
p=a; //指针变量p重新指向数组首元素
count(p,n);
for(i=0;i<=MAX;i++)
{
switch(i)
{
case 0:cout<<"弃权:"<<a[i]<<endl;break;
default:cout<<i<<"号票数:"<<a[i]<<endl;break;
}
}
return 0;
}
数组名代表数组首元素的地址,所以a与&a[0]是等价的。如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。但需要注意的是,数组名a是数组首地址,不是指针变量,指针变量可以改变值,而地址是不可以像变量一样改变其值的,如a++是非法的。
练习
(1)设有变量定义语句“int a[10];”能正确引用数组a中元素的表达式是( )。
A.&a[5] B.*(a+2) C.a+2 D.*(*(a+3))
(2)阅读程序写结果。
#include <iostream>
using namespace std;
void swap(int *p1, int *p2)
{
int temp;
temp=*p1;
*pl=*p2;
*p2=temp;
}
int main()
{
int a[2], *p;
cin>>a[0]>>a[1];
p=&a[0];
swap(p,p+1):
cout <<*(p+1)<<endl;
return 0;
}
输入:10 20
输出:_______
(3)完善程序。
风之巅小学每学年都要对语、数、英、科四门学科进行期末测试,请编程序帮助尼克算总分。
#include <iostream>
using namespace std;
int main()
{
int a[4], i, sum,__________;
sum=0;
for(i=0;i<4;i++)
cin>>a[i];
for(p=a;p<(a+4);p++)
__________;
cout << sum << endl;
return 0;
}
三、类与对象
(第82课 编程是一门艺术)
类是C++中十分重要的概念,是实现面向对象程序设计的基础,C++最初被称为“带类的C”。在C++中用class来声明类,用类名来定义对象。
以下是一个运用类来输出“编程小艺术家”姓名、年龄的程序,
#include <iostream>
using namespace std;
class artist //用class来声明类,类名为artist
{
private: //声明私有的数据和成员函数
string name; //只能在本类中的成员函数引用,类外不能调用
int age;
public: //声明公有的数据和成员函数,本类和类外都能调用
void set(string studname,int studage)
{
name=studname;
age=studage;
}
void display() //成员函数
{
cout<<"编程是一门艺术"<<endl;
cout<<"小艺术家的姓名:"<<name<<endl;
cout<<"小艺术家的年龄:"<<age<<endl;
cout<<"---------------"<<endl;
}
}; //注意,这里有分号
int main()
{
artist stud1,stud2; //定义了artist类的两个对象stud1,stud2
stud1.set("nike",11);
stud1.display();
stud2.set("glair",12);
stud2.display();
return 0;
}
类artist:有两个对象 studl和stud2,同时在类 artist中定义了私有数据成员name和age。公用成员函数set()和display()。类是对象的抽象,而对象是类的具体实例。