文档介绍:第二十一章指针三实例演练与提高
简单变量、数组、指针
的问题
  软件升级历史
指针的最常用用法
  分配内存
  访问指针指向的内存
小王成绩管理系统
字符串指针
  为字符串分配指定大小的空间
  字符串常用函数
    字符串比较
    字符串复制
指针数组
  什么叫“指针数组”?
  指针数组实例一
  指针数组实例二
  字符串指针数组 
简单变量、数组、指针
学习的知识点越来越多了……
刚开始会觉得很兴奋啊,学得越多越好嘛。可慢慢的就会感到压力了,各种知识点在头脑里混在一起,每个都变得模糊了。
其实,每个知识点都有它存在,或出现的理由,只要我们多做对比,就会发现学习的知识点越多,反倒越容易理解每个知识点本质。
比如说,简单变量、数组、指针,三者都是C++中用于表达数据的工具,但在表达能力上,又各有不同。
如果用建筑上的房间来比喻:
简单变量是一间房屋。优点是占用空间少,建筑时间短,缺点是一间房子只适于住一个人;
数组是房间数固定的一排房子,每个房子里头同样只住一人,但由于它有多间,所以适于多人居住,优点是可以统一管理多人,缺点一来是占用空间大,二来房间数一旦确定,就不能改变了。先头盖了10间,如果如果来了11个人,就有一人住不下,如果来了9个人,就有一间浪费。
指针呢……它不是实际房子,而是设计纸上的房子。因此,它首先有一个特点:如果你想让指针存储数据,那一定得先为它分配内存。这就像光有一张设计蓝图是解决不了四代同堂的问题的,重要的是你还得根据这张蓝图,去找块地皮盖好房子。指针的优点是可以临时决定要盖多少间房子。
下面我们回顾一个例子,以理解三者的不同用处。
先回顾一下该程序的升级过程,今天我们将对它做出两种不同方向的改进。
软件升级历史
: 本版成绩管理系统实现让计算机自动统计6个班级的成绩总分和平均分。
: 经过改进,本版可以实现多达5000个学生的成绩进行求总分和平均分,并且可以支持用户输入序号,查询任意一个学生的成绩!
在第一版,小王正在学习“循环流程”。通过在每次循环中,让用户输入一个成绩,然后保存在一个简单变量里,并累加到另一个简单变量,最终计算出总分和平均分。
第二版,由于段长要求不仅可以统计5000个学员的成绩,而且应实现成绩查询功能,这就要求程序必须同时记下5000个学生成绩。小王先是想用5000个简单变量来记下成绩——这显然太不实际了,后来学到数组,用数组轻松解决了这个问题,因为数组正是为“同时存储多个相同类型的变量”这一问题来设计的。
然而,第二版存在的不足也是显然易见的。那就是,它固定只能处理最多5000个学员的成绩。假想,这个软件要推广到全市300个学校,每个学校的学生总数都是不一样的,更惨的是每一年,一个学校的学生个数总是会有变化。难道就让我们的王老师时不时地改它的程序?
在没有指针时,惟一办法就是,浪费一点,比如定义数组元素个数为1万。目的是宁可浪费一点,也尽量不要出现不够的情况。显然,本办法只能算是一个无奈之举。难道就没有一个办法,即可以适应某个山区小学只有30名学员也情况,又可以轻松对付某大学高达2万名学员的情况?
锣声响起,锵锵锵……指针出场了。
指针是如何完成这一历史使命?带着问题,我们来学习下面的内容。
我们会在学习新内容之中,同时有选择地做一些旧知识点的复习工作。但如果你仍看不懂下面的一些代码,那得全面复习前两章的指针内容;或者,如果你连for都有些陌生,那你得重温一下小王成绩管理系统的前两个版本。
指针的最常用用法
分配内存
如何为指针分配和释放内存,上一章的内容中讲到了C++独用的new/delete、new[] / delete[] 和 C 使用的malloc, realloc/ free 方法。如果你忘了,请先复习。我们这里使用C++的方法演练。
new 只能为我们分配一个简单变量的内存,就是说new只盖了一间房子。new [] 才能为我们盖出一排的房子。
例子:
int* p; //定义一个整型指针
p = new [10];  //new [] 为我们分配出10个int大小的内存。(盖了10间房,每间住一个整数)