《C语言程序设计》课程教案
课题
指针
课型
专业基础课
课时序
19
课时
2
授课时期
2014-06-13周五 13级电商1班 1-2节
2014-06-13周五 13级电商2班 3-4节
教学目的
1、掌握指针的概念。
2、熟练掌握指针的应用。
3、掌握字符数组的定义和引用。
教学重点难点
重点:
1、掌握指针的概念
2、掌握用指针编程
难点:
1、指针的运算
2、指针数组的应用
教学方法
主要运用讲授法,兼用演示法。
教学内容提纲
9.1 指针的概念
9.2 变量与指针
9.3 数组与指针
9.4 字符串与指针
课后小结
主要运用讲授法。(1.举例引导2.提问3.类比)利用多媒体课件进行教学,扩大课堂教学的信息量。
教学过程:
本章导读:指针是C语言的一种数据类型,在C语言中处于重要的地位。正确、灵活地应用指针可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;方便高效地使用数组。熟练地应用指针可以使C程序简洁、紧凑、应用效果好。
9.1 指针的概念
一个变量的地址称为该变量的指针。
9.2 变量与指针
1、指针变量的定义
定义指针的一般形式为 基类型 *指针变量名
例如:int *p1; (定义p1为指向整型变量的指针变量)
char *p2; (定义p2为指向字符型变量的指针变量)
float *p3; (定义p3为指向实型变量的指针变量)
int、char、float分别称为指针变量p1、p2、p3的“基类型”,“基类型”意为指针变量所指变量的类型,不是指针变量的类型。
2、指针变量的赋值 可以使用不同的方法给一个指针变量赋值。
1.通过取地址运算符(&)获得地址值
单目运算符(&)用来求出运算对象的地址,利用它可以把一个变量的地址赋给指针变量。例如有如下定义和赋值:int a=5, *p, *q; p=&a;
2.通过指针变量获得地址值
可以通过赋值运算,把一个指针变量中的地址值赋给另一个指针变量,从而使这两个指针变量指向同一地址。例如,若有上面的定义,则语句:q=p;使指针变量q中也存放了变量a的地址,也就是说指针变量p和q都指向了整型变量a。使用时应注意:赋值号两边指针变量的基类型必须相同。
3.给指针变量赋“空”值
p=NULL;
3、指针变量的引用
1.&:取地址运算符
2.* :间接访问运算符(指针运算符)
例9.1 通过指针变量访问指针变量
main( )
{int a, b, *p1, *p2;
a=10; b=20;
p1=&a; /*把变量a的地址赋给指针变量p1*/
p2=&b; /*把变量b的地址赋给指针变量p2*/
printf(″%d, %d\n″, a, b);
printf(″%d, %d\n″, *p1, *p2); }
程序的运行结果为:
10,20
10,20
9.3数组与指针
1、问题的提出
用指针法对数组进行输入和输出
main( )
{int a[10], *p;
p=&a[0];
for(p<=&a[9]; p++)
scanf (″%d″, p);
for(p=&a[0];p<=&a[9];p++)
printf (″%d″,*p);
printf(″\n″); }
[说明]
1.程序的第3行将数组元素a[0]的地址赋给指针变量p,使指针p指向了a[0]这个元素。C语言规定:数组名代表数组的首地址(起始地址)
因此下列两条语句等价:p=&a[0]; p=a;
2.程序中的第一个循环是将10个数读入数组a中。第二个循环将数组a中的元素输出。请注意两个循环中p++的作用,它每次自加后都指向了下一个元素。
以上程序也可以写成下面的形式:
main( )
{ int a[10], *p;
for(p=a; p<=a+9;p++)
scanf(″%d″,p);
for(p=a; p<=a+9; p++)
printf(″%d ″, *p);
printf(″\n″); }
程序中a+9的值是数组最后一个元素(a[9])的地址。
2、指向数组的指针
定义指向数组的指针与定义指向变量的指针类似,其格式为:
基类型 *指针变量名 其中基类型是数组的基类型。
例如:int a[10], *p1, *p2, *p3, *p4;
要使指针指向数组,可以使用如下语句:
p1=&a[0]; /*p1指向数组元素a[0] */
p2=a; /*p2指向数组元素的首地址,也是指向数组元素a[0] */
p3=&a[4]; /*p3指向数组元素a[4] */
p4=a+4; /*p4指向数组元素a[4] */
9.4 字符串与指针
1、用一个一维字符数组来存放字符串
1.C语言对字符串的约定:以字符′\0′作为字符串结束标志。
2.C语言中表示字符串常量的约定
虽然C语言中没有字符串数据类型,但却可以使用“字符串常量”。
3.C语言中字符串常量给出的是地址值
在C语言中,字符串常量被隐含处理成一个以′\0′结尾的无名的字符型一维数组。因此,若有以下定义:char *sp, s[10];
以下赋值是不合法的:s=″Hello!″;不合法的原因是:内容为Hello!的字符串常量在赋值过程中给出的是这个字符串在内存中的首地址,而s是一个字符数组的数组名。因此,该赋值是非法的。
而以下的赋值:sp=″Hello!″;
4.字符数组与字符串的区别
在C语言中,有关字符串的大量操作都与字符串标志′\0′有关,因此,在字符数组中的有效字符后面加上′\0′这一特定情况下,可以把这种一维字符数组看作“字符串变量”。
2、指向字符串的指针
使指针指向一个字符串的方法主要有以下几种方法:
1.通过赋初值使指针指向一个字符串
char *ps=″Hello!″;
2.通过赋值运算使字符指针指向字符串
char *ps; ps=″Hello!″;
也可以通过将指针变量之间的赋值使指针指向字符串。
例如:char *ps1, *ps2=″Hello!″; ps1=ps2; 使ps1也指向了ps2所指向的字符串。还可以将字符数组名赋给字符指针变量而使其指向字符串。
例如:char *ps1, s[ ]= ″Hello!″; ps1=s;
例9.1 用指针法将字符串a复制为字符串b。
# include″stdio.h″
main( )
{char a[20], b[20], *p1, *p2;
int i;
gets(a);
for(p1=a,p2=b; *p1!=′\0′; p1++, p2++)
*p2=*p1;
*p2=′\0′;
puts(b);
}
课堂提问与讨论
课堂小结、作业布置
本章主要介绍了指针的概念、指向变量的指针、指向数组的指针、指向字符串的指针、指针数组以及多级指针等。
所谓指针其实就是地址,由于可以通过地址找到存储于内存中的变量,所以形象地把地址称为指针。
指针变量是存储地址的变量,通过指针变量可以很方便地对存储于内存单元中的变量进行操作。
在用指针处理数组时,可以通过指针的移动来访问数组的每一个元素。在用指针处理字符串时,可以充分利用字符串结束标志′\0′。
指针数组一般用来处理多个字符串的情况。
多级指针一般使用到二级指针为止,主要用来处理二维数组等情况。