内容正文:
教案用纸
第 8 周 总第 23 次 学时:2
教学班级: 课程:C语言程序设计 授课教师:
课题:6.1 地址和指针的关系 6.2 指针的定义和赋值 6.3 指针变量的运算
教学方法:启发式、案例式
教具:常规教具
教学目标:使同学们掌握指针的定义及基本运算
教学重点:指针的定义及各种基本运算
教学难点:指针定义以及指向指针的指针
主要教学内容:
6.1 地址和指针的关系
6.2 指针的定义和赋值
6.2.1 指针变量的定义及初始化
6.2.2 指针变量的赋值
6.3 指针变量的运算
6.3.1 *运算符和&运算符
6.3.2 指针的算术运算和关系运算
小结:
课后回顾:
教案用纸
四个一:
导入:指针在C语言中占有重要的地位,同时指针也是C语言的一大特色。现在,我们学习一种特殊的专门用于存储地址的变量——指针变量,通过指针变量间接访问指针所指向的数据。
正文:
6.1 地址和指针的关系
计算机中的所有数据都是顺序存放在存储器中的。一般把存储器中的一个字节称为一个内存单元(亦称存储单元),不同数据类型的值所占用的内存单元数亦不同。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址,通常也把这个地址称为指针。
内存单元的指针和内存单元的内容是两个不同的概念。可以用一个通俗的例子来说明它们之间的关系。例如,有一个超市叫“欣欣超市”,邮编地址是“沈阳市大东区劳动路12号3单元1楼2号”,里面住的人叫“张三”。这里的“欣欣超市”就相当于变量名(方便记忆),而邮编地址就相当于指针,而住的人“张三”就相当于变量的值。现实中既可以通过“欣欣超市”来找到张三,也可以通过邮编地址来找到张三。同理,在C语言中,既可以通过变量名来使用所存储的值,也可以通过指针来使用其所指变量的值。
下面了解一下与指针相关的一些概念。
(1)存储地址:计算机中数据都存放于从某个特定的地址开始的一个或若干个存储单元中,这个特定的地址即为该数据的存储地址,程序中通过变量名与这个存储地址进行对应。
(2)指针变量:是用于存储数据地址的变量,由于地址指明了数据存储的位置,因此指针变量被形象地称为“指针”,该地址中存放的数据也被形象地称为“指针所指向的数据”,如图6-1所示。
(3)直接访问:指对数据的存取操作通过变量名进行,而没有通过地址进行操作。
(4)间接访问:指通过使用指针而不使用变量名访问指针所指向的数据。
(5)指针的类型:指针的类型就是指针所指向的数据的类型。例如,有一个整型指针,它所指向的变量就必须是整型变量。
(6)指针的长度:是指针变量所占的内存字节数。若地址值是16位,则指针变量的长度是2;若地址值是32位的,则指针变量的长度就是4。
6.2 指针的定义和赋值
6.2.1 指针变量的定义及初始化
指针变量的定义格式如下:
(
数据类型
*
指针变量名
;
)
指针变量的定义并初始化格式如下:
(
数据类型
*
指针变量名
= &
变量名
;
)
说明:数据类型可以是任意类型,是指针所指向的变量的类型。“*”是一个说明符,用来说明其后的变量是一个指针变量。
没有指向的指针变量的值是随机的。只有被赋值以后,指针变量才有确定的指向,没有初始化的指针变量必须在使用之前进行赋值操作,使其有所指向。
例如:
int a=5; /*定义了一个整型变量a,a中存储的值是5*/
int *p; /*定义一个指向整型变量的指针p,但p没指向任何变量*/
int *q=&a; /*定义一个指向整型变量的指针q,并将它指向变量a*/
6.2.2 指针变量的赋值
一个指针变量除了在定义的同时被赋值(初始化)外,也可以在定义后通过不同的“渠道”获得一个确定的地址值,从而指向一个具体的对象。
(1)通过取地址运算符“&”获得一个变量的地址值。先定义指针变量,然后通过赋值语句给指针一个初值,例如:
int k,*q; /*定义了一个整型变量k和整型指针q,指针q没指向任何变量*/
q=&k; /*将k的地址赋给指针q,即相当于指针q指向了变量k*/
(2)通过数组名给指针变量赋值。
int a[10],*q; /*定义了一个整型数组a和整型指针q*/
q=a; /*将数组名赋值给指针q,相当于指针q指向了数组的首地址*/
(3)通过指针变量获得地址值。
int k,*p; /*定义了一个整型变量k和整型指针p,指针p没指向任何变量*/
int *q=&k; /*定义指针q并将其指向变量k*/
p=q; /*将指针q的值赋给指针p,相当于p和q指向同一个变量k*/
(4)通过标准函数获得地址值。通过调用malloc和calloc函数,在内存中开辟动态存储区域,并把所开辟的动态存储区域的地址赋给指针变量。
int *p1; /*定义一个指向整型变量的指针p1,但p1没指向任何变量*/
p1=(int *)malloc(sizeof(int)); /*动态开辟一个整型变量空间,并将p1指向该变量空间*/
(5)给指针变量赋NULL值。
int *p;
p=NULL; /*指针p被赋为空指针,即不指向任何变量*/
(6)把函数的入口地址赋予指向函数的指针变量。例如:
int (*pf)( ); /*定义一个指向函数的指针,后面会有详细介绍*/
pf=f; /*将指针pf指向函数f,其中f为函数名*/
6.3 指针变量的运算
指针也是一种变量,那么就应该可以作为操作数,和操作符一起组合成表达式,从而实现更复杂的功能。但是,指针是一种特殊的变量,它保存的是地址值,对这样的指针变量,可以参与哪些运算呢?
6.3.1 *运算符和&运算符
*运算符作用在指针(地址)上,代表该指针所指向的存储单元(及其值),实现间接访问,因此又叫“间接访问运算符”。
例如:
int a=5; /*定义了一个整型变量a,a中存储的值是5*/
int *p=&a; /*定义一个指向整型变量的指针p,并将它指向变量a*/
*p的值为5,与a等价。*运算符为单目运算符,与其他的单目运算符具有相同的优先级和结合性(右结合性)。根据*运算符的作用,*去处符和取地址去处符&互逆。即:
*(&a)==a &(*p)==p
提示:*的意义
在定义指针变量时,“*”表示其后的是指针变量;在执行部分表达式中,“*”是指向运算符。
6.3.2 指针的算术运算和关系运算
指针变量有赋值运算,指针有指向运算。有意义的指针运算还包括算术运算和关系运算。不过,参与算术运算和关系运算的指针是有一定限制的,通常在指针代表一些连续的存储单元的情况下才有实际意义。
1.指针的算术运算
四种可以应用于指针的算术运算符:++(自增)、--(自减)、+(加)、-(减)。
(1)指针的自增或自减运算。作用是使指针指向下一个或前一个同类型的数据。
(2)指针变量加上或减去一个正整数n。作用是将该指针移到当前位置之后或之前第n个数据的位置。
(3)两个指针变量的减法运算。作用是求两个指针位置相差的变量个数,结果是一个整数。
例如:
char str[10]=”Hello Baby!” /*定义一个字符数组str并将字符串Hello Baby!存入*/
char *p=str,*q; /*定义指针p和q,并将p指向字符数组首地址,即指向字符H*/
这里应说明的是,并不是把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量。即指针p指向字符数组的首地址,指向字符H。
若有语句:
p++;
则指针p向右移动一个字符位置,即指向字符e。
若有语句:
q=p+5;
则相当于指针q移动到字符B上。
此时若有语句:
int n;
n=q-p;
则相当于求得指针p和q之间相差的数组元素个数,即n值等于5。
指向数组的指针也可以有下标运算。即指针也可与数组的下标结合,表示数组中的某个元素。例如,当p指向字符e时,p[0]就表示该数组元素e。同理可写为p[4]、q[2]等。
2.指针的关系运算
在两个指向相同类型变量的指针之间可以进行各种关系运算,用来表示它们指向的地址位置之间的关系。
关系运算符有:>、>=、<、<=、!=、==,可以对两个指针进行大小(地址值高低)的比较。指向后方的指针大于指向前方的指针;如果两个指针相等,则表明它们指向同一个数据。
例如,上面例子中的指针p和q,若有条件q>p,则结果为真。
小结:本讲学习了各种类型指针的定义和初始化、赋值。重点内容是指针的算术运算和关系运算,要求读者能够熟练掌握并应用。
还学习了指针与数组的关系,希望同学们能够熟练应用并掌握:
(1)使用指针访问数组元素
(2)应用字符指针访问字符串
备 注
通过案例式教学,说明什么是指针,使同学们了解在什么情况下使用指针。
难点:指针概念。指针概念教难理解,通过比拟方式启发同学们对指针的理解。
通过图片形象的表示指针与指针所指向的数据之间的关系。
重点:指针的定义。与变量的定义进行比较讲解。
重点:与变量的赋值进行比较讲解。
重点:可以通过案例式讲解指针的运算关系。
难点:指针本身也是数据,所以也有指针指向指针变量。
学科网(北京)股份有限公司
$$