内容正文:
项目八 指针
1
C语言程序设计基础
知识目标
掌握指针变量的定义与使用
掌握通过指针变量来引用数组
掌握通过指针变量来引用字符串
掌握指针数组
了解函数指针与指针函数
了解动态内存分配与指向它的指针变量
技能目标
学会指针变量的定义与使用
学会通过指针变量来引用数组
学会通过指针变量来引用字符串
学会指针数组的定义与使用
思政目标
培养全局观,大局意识
培养沟通能力与协调能力
2
任务2
——通过指针引用数组
3
与指向普通变量的指针变量的定义方法一样
说明:
(1)一个变量有地址,一个数组包含若个元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址赋值给一个指针变量)。所谓数组元素的指针就是数组元素的地址。
(2)数组名代表数组在内存中的起始地址(与第一个元素的地址相同),所以可以用数组名给指针变量赋值。
指针——基础篇
2.1指向数组的指针变量的定义与赋值
4
数组元素的引用,既可用下标法,也可用指针法。
使用下标法,直观;
使用指针法,能使目标程序占用内存少、运行速度快。
说明:
(1)如果pointer的初值为&a[0](或者a),则pointer+i和a+i都是数组元素a[i]的地址;*(pointer+i)和*(a+i)就是数组元素a[i]的值。
(2)指向数组的指针变量也可将其看作是数组名,因而可按下标法来使用。
指针——基础篇
2.2通过指针引用数组元素
5
【例8-5】计算冬奥会花样滑冰选手的得分(10个裁判,要求去掉一个最高分、去掉一个最低分,再求平均分)。
【方法1】用下标法引用数组元素。
指针——基础篇
6
【程序代码】
指针——基础篇
7
【运行结果】
指针——基础篇
8
【方法2】用指针的下标表示法引用数组元素。
指针——基础篇
9
【程序代码】
指针——基础篇
10
【方法3】用指针变量引用数组元素。
指针——基础篇
11
【程序代码】
指针——基础篇
12
【方法4】通过指针变量自增运算引用数组元素。(自增运算实现指针的移动,效率最高)。
指针——基础篇
13
【程序代码】
指针——基础篇
14
数组元素作为函数的实参:数组元素的引用与一般变量的引用是一样的,传递的是数组元素的值,属于“值传递”方式。
数组名作函数参数:数组名可以用作函数的形参和实参,实参与形参应匹配。
实参:数组名、指针变量、数组名、指针变量。
形参:数组名、数组名、指针变量、指针变量。
指针——基础篇
2.3数组作函数参数
15
【例8-6】使用函数调用的方式实现例7-5。
【解题思路】发生函数调用时需要传递整个数组给形参变量,因此使用数组名或指针变量作实参。
【方法1】数组名作函数参数。
指针——基础篇
16
【程序代码】
指针——基础篇
17
18
【运行结果】
指针——基础篇
19
【方法2】指针变量作函数参数。
指针——基础篇
20
【程序代码】
指针——基础篇
21
22
【方法3】指针变量自增来遍历数组。
指针——基础篇
23
【程序代码】
指针——基础篇
24
【程序分析】
(1)方法1简洁明了,适合于对指针不太了解的读者。方法2和方法1类似,只是实参和形参换成了指针变量。方法3运行效率最高,也最容易出错。
(2)方法3中特别设定了一个指针变量first来记录数组首地址,因为随着指针变量的自增,它不再指向数组的首地址。这就是指向数组的指针变量自增最需要注意的问题,遍历数组结束一定要将指针变量指回数组的首地址,同时在遍历过程中,循环条件中代表数组首地址+数组长度的表达式,不能出现指针变量,否则会陷入死循环。
指针——基础篇
25
指向二维数组的指针变量
2. 行指针变量
(1)概念:指向由n个整数组成的一维数组的指针变量,可用于处理二维数组。
(2)定义格式:类型名 (*指针名)[数组长度]
例如int score[3][4],(*pointer)[4]。
(3)说明(pointer=score):
表示pointer是行指针变量,它只能指向包含有4个整型元素的一维数组。此时pointer的值就是该一维数组(二维数组的行)的首地址。pointer不能指向一维数组中的某一个元素。
指针——基础篇
2.4二维数组与指针
26
【例8-7】有一个学习小组,4个学生,学5门课,计算小组总平均分以及第n个学生的成绩。
【解题思路】由于有4*5个数据,因此使用指向二维数组的指针作函数参数。用函数init初始化学生成绩,函数average求总平均成绩,用函数query找出并保存第n个学生的成绩,用函数print输出第n个学生的成绩。
指针——基础篇
27
【程序代码】
指针——基础篇
28
29
【运行结果】
指针——基础篇
30
$$