1、同学们,加油噢!教学主题教学主题指针变量的定义和运算、指针变量作函数参数指针变量的定义和运算、指针变量作函数参数教学目标教学目标 通过本次课的学习,使学生掌握指针的概念、通过本次课的学习,使学生掌握指针的概念、指针变量的概念和定义方法、指针变量的运算、指针变量的概念和定义方法、指针变量的运算、以及指针变量作为函数参数的用法。以及指针变量作为函数参数的用法。教学重点教学重点 1、指针变量的定义、赋值、指针变量的定义、赋值 2、指针变量的运算、指针变量的运算 3、指针变量作为函数参数的用法、指针变量作为函数参数的用法教学难点教学难点 1、指针和指针变量的区别、指针和指针变量的区别 2、指针变量作为
2、函数参数的实质及效果指针变量作为函数参数的实质及效果教案教案主要内容主要内容 指针和指针变量的概念指针和指针变量的概念 指针变量的定义和赋值指针变量的定义和赋值 指针变量的运算指针变量的运算 指针变量作为函数的参数指针变量作为函数的参数为什么引入指针为什么引入指针 指针是指针是C语言的特色、精华语言的特色、精华 程序设计时应用指针的好处程序设计时应用指针的好处 支持动态分配内存支持动态分配内存 能有效而方便地使用数组(包括字符串)能有效而方便地使用数组(包括字符串)可以在函数调用时返回多个值可以在函数调用时返回多个值举例举例 在程序中,有如下语句。问:内存中会如何变化?在程序中,有如下语句。问
3、:内存中会如何变化?int x,y;x=12;y=20;1220内存单元的编内存单元的编号,叫地址号,叫地址&x&y内存地址内存地址 在计算机中,在计算机中,所有的数据所有的数据都是都是存放在存放在存储器中的。存储器中的。一般把存储器中的一般把存储器中的一个字节一个字节称为称为一个内存单元一个内存单元。为了正确地访问这些内存单元,必须为了正确地访问这些内存单元,必须为每个内存为每个内存单元编上号单元编上号。根据编号就可以准确地找到该内存单。根据编号就可以准确地找到该内存单元。元。内存单元的编号内存单元的编号也叫做也叫做内存内存地址地址。程序中一个变量包含了两个概念:程序中一个变量包含了两个概念
4、:变量在内存中的地址变量在内存中的地址 存放在该地址中的内容存放在该地址中的内容 注意注意 变量的地址变量的地址是由是由系统分配系统分配的,在程序中的,在程序中只可使用只可使用,不能修改不能修改。内存单元的地址和内存单元的内容内存单元的地址和内存单元的内容内存单元的地址内存单元的地址内存单元的内容内存单元的内容指针和指针变量的定义指针和指针变量的定义 C语言中,将语言中,将地址地址形象化地称为形象化地称为“指针指针”。意思。意思是通过它可以找到以它为地址的内存单元。是通过它可以找到以它为地址的内存单元。一个一个变量的地址变量的地址称为称为该变量的指针该变量的指针。即:。即:指针就指针就是内存地
5、址。是内存地址。如果一个变量专门存放另一个变量的地址(即指如果一个变量专门存放另一个变量的地址(即指针),则称为针),则称为指针变量指针变量。问:指针、指针变量是一回事吗?问:指针、指针变量是一回事吗?指针变量举例指针变量举例 在在图图6-2中,变量中,变量x占用了占用了20A0起的起的2个内存单元,其个内存单元,其内容(值)为内容(值)为12。设有指针变量设有指针变量P,内容为,内容为20A0。这种情况我们称为这种情况我们称为P指向指向变量变量x,或称,或称P是指向变量是指向变量x的指针变量的指针变量。指针变量的定义指针变量的定义 定义指针变量时要包括三个内容:定义指针变量时要包括三个内容:
6、指针变量类型说明,即标明变量为一个指针变量。指针变量类型说明,即标明变量为一个指针变量。指针变量名。指针变量名。指针变量所指向的变量的数据类型。指针变量所指向的变量的数据类型。其一般形式为:其一般形式为:类型标识符类型标识符 *指针变量名;指针变量名;标明这是标明这是一个指针一个指针变量变量变量名变量名本指针变量所本指针变量所指向的变量的指向的变量的数据类型数据类型定义指针变量举例定义指针变量举例 针对图针对图6-2,应该如何定义,应该如何定义x和和p?int x;int *p;表示表示p是一个指针变量,是一个指针变量,它指向某个整型变量。它指向某个整型变量。如何给这两个变量赋值?如何给这两个
7、变量赋值?x=12;p呢?呢?指针变量的赋值指针变量的赋值指针变量指针变量同普通变量一样,使用之前不仅要同普通变量一样,使用之前不仅要定义定义,而且,而且必必须赋予具体的值须赋予具体的值。给指针变量赋值给指针变量赋值只能赋予地址只能赋予地址,不能赋予任何其它数据。,不能赋予任何其它数据。语言中提供了语言中提供了地址运算符地址运算符&来表示变量的地址。来表示变量的地址。其一般形式为:其一般形式为:&变量名变量名例如:例如:&a变示变量变示变量a的地址。的地址。指针变量赋值举例指针变量赋值举例 针对图针对图6-2,有如下语句:,有如下语句:int x;int *p;x=12;如何给如何给p变量赋值
8、?变量赋值?p=&x;如何在定义的同时给变量赋值?如何在定义的同时给变量赋值?int x=12;int *p=&x;在用之前,在用之前,x已定义已定义给指针变量赋值时的注意点给指针变量赋值时的注意点 可以让指针变量不指向任何变量。可以让指针变量不指向任何变量。int *p;p=NULL;(NULL在在stdio.h中有定义)中有定义)通常不允许直接把一个数值赋给指针变量。通常不允许直接把一个数值赋给指针变量。int*p;p=1000;被赋值的指针变量前不能再加被赋值的指针变量前不能再加“*”说明符。说明符。int a,*p;*p=&a;一个指针变量只能指向同类型的变量。一个指针变量只能指向同类
9、型的变量。float b;int *p;p=&b;错误的用法错误的用法错误的用法错误的用法错误的用法错误的用法指针变量的特殊性指针变量的特殊性 指针变量指针变量也是一种变量也是一种变量。指针变量指针变量只不过是一种只不过是一种特殊的变量特殊的变量,其特殊性,其特殊性表现在表现在类型类型和和值值上。上。指针变量的类型指针变量的类型是是指针所指向的变量的类型指针所指向的变量的类型。指针变量的值指针变量的值是是某个变量在内存中的地址某个变量在内存中的地址。指针变量使用技巧指针变量使用技巧 指针变量的使用原则:指针变量的使用原则:先赋初值(地址),再使用。先赋初值(地址),再使用。理由:理由:安全使用
10、指针变量的方法:安全使用指针变量的方法:对暂时不使用的指针,可先定义成空指针。即将对暂时不使用的指针,可先定义成空指针。即将其赋值为其赋值为NULL。使用未经赋值的使用未经赋值的(浮游)指针(浮游)指针危害很大。危害很大。与指针变量有关的运算符与指针变量有关的运算符 与指针变量有关的运算符与指针变量有关的运算符有两个有两个:&和和*。取地址运算符(取地址运算符(&)单目运算符,右结合。单目运算符,右结合。取内容运算符(取内容运算符(*),也叫指针运算符),也叫指针运算符 单目运算符,右结合。单目运算符,右结合。作用:用来表示指针变量所指向的变量的内容。作用:用来表示指针变量所指向的变量的内容。
11、指针变量引用举例指针变量引用举例问:下面程序的运行结果是什么?问:下面程序的运行结果是什么?#include stdio.hvoid main()int a,b;int *p;a=123;p=&a;b=*p;*p=-200;printf(a=%d,b=%dn,a,b);p=&b;printf(“%d,%dn,b,*p);程序运行结果程序运行结果a=-200,b=123123,123运行程序运行程序(3_1)思考思考p p的指向;的指向;第第2 2个个printfprintf中的访问方式中的访问方式指针变量的运算指针变量的运算 除了除了&和和*两种运算之外,两种运算之外,指针变量还可以指针变量还
12、可以进行进行赋赋值运算、加减算术运算和关系运算值运算、加减算术运算和关系运算。指针变量的赋值运算指针变量的赋值运算 把一个指针变量的值赋予指向相同类型变量的另一个指针把一个指针变量的值赋予指向相同类型变量的另一个指针变量。变量。int a,*pa=&a,*pb;pb=pa;把数组的首地址赋予同类型的指针变量。把数组的首地址赋予同类型的指针变量。int a5,*pa;pa=a;或或 pa=&a0;把字符串的首地址赋予指向字符类型的指针变量。把字符串的首地址赋予指向字符类型的指针变量。char*pc;pc=I am a student!;也可用初始化赋值的方法写为:也可用初始化赋值的方法写为:ch
13、ar*pc=I am a student!;不表示把整个字符串不表示把整个字符串装入指针变量,只是装入指针变量,只是把字符串的首地址装把字符串的首地址装入指针变量。入指针变量。回顾字符数组的赋值!回顾字符数组的赋值!对于指向数组的指针变量,可以加上(或减去)对于指向数组的指针变量,可以加上(或减去)一个整数一个整数n。设设pa是指向数组是指向数组a的指针变量,的指针变量,则则pa+n、pa-n、pa+、+pa、pa-、-pa运算都是合法的。运算都是合法的。举例举例 int a10,*pa;pa=a;pa=pa+2;指针变量的加减运算指针变量的加减运算1pa?运行程序运行程序(3_2)看源程序看
14、源程序(3_2)指针变量的加减运算指针变量的加减运算2 指向同一数组的两个指针变量,可以进行减法运算。指向同一数组的两个指针变量,可以进行减法运算。(两指针变量相减两指针变量相减)如果两指针变量指向同一个数组,则如果两指针变量指向同一个数组,则相减相减的结果的结果是两个指针之间相差的元素个数。是两个指针之间相差的元素个数。例如例如在右图中,在右图中,p1指向指向a1,p2指向指向a5,则则p2-p1=?注意:注意:p1+p2无任何实际意义。无任何实际意义。p1p24运行程序运行程序(3_3)看源程序看源程序(3_3)两指针变量相减的应用两指针变量相减的应用【例【例6-2】求字符串的长度,要求不
15、用求字符串的长度,要求不用strlen库函数。库函数。源程序源程序#include stdio.hvoid main()char *s=CProgram!;char *p=s;int len;while(*p!=0)p+;len=p-s;printf(该字符串的长度为该字符串的长度为%d。n,len);程序运行结果程序运行结果 该字符串的长度为该字符串的长度为9。运行程序运行程序(3_4)指针变量的关系运算指针变量的关系运算 指向同一数组的两指针变量可以进行关系运算指向同一数组的两指针变量可以进行关系运算,表示它们表示它们所指数组元素的地址之间的大小关系所指数组元素的地址之间的大小关系。例如:
16、例如:右图中,表达式右图中,表达式“p2p1”的值为?的值为?任何类型的指针变量还可以与任何类型的指针变量还可以与NULL进行比较。进行比较。例如:例如:设设p为指针变量,为指针变量,“p=NULL”为真时表示为真时表示p是空指针,是空指针,它不指向任何变量;它不指向任何变量;“p!=NULL”为真时表示为真时表示p不是空指针。不是空指针。p1p2真指针变量关系运算的应用指针变量关系运算的应用【例】【例】利用指针变量实现输出数组元素。利用指针变量实现输出数组元素。源程序源程序#include stdio.hvoid main()int a5=1,2,3,4,5;int*p,*end;p=a;e
17、nd=a+5;while(p end)printf(“%d”,*p);p+;运行程序运行程序(3_5)回顾回顾 思考两个问题思考两个问题 上学期学过哪些变量?上学期学过哪些变量?作为函数参数时,采用什么方式传递数据?作为函数参数时,采用什么方式传递数据?看源程序看源程序(3_6)举例举例函数参数传递规则总结函数参数传递规则总结 C语言的函数参数传递规则语言的函数参数传递规则 单向值传递单向值传递 就就“值值”而言,有两种:而言,有两种:传递数值传递数值修改形参,不会影响到实参修改形参,不会影响到实参 传递地址传递地址通过形参可以访问实参通过形参可以访问实参指针变量作为函数的参数指针变量作为函数
18、的参数 指针变量作函数参数指针变量作函数参数 传递的值:传递的值:地址地址 特点:特点:可以改变实参指针变量所指向的变量的值。可以改变实参指针变量所指向的变量的值。好处:好处:可以返回多个值可以返回多个值指针变量作函数参数举例指针变量作函数参数举例1【例【例6-3】编写程序,完成一个学生两门课程成绩的输入和输出。要求用两编写程序,完成一个学生两门课程成绩的输入和输出。要求用两个函数个函数input和和output分别实现成绩的输入和输出。分别实现成绩的输入和输出。分析分析 假定两门课程成绩存放在变量假定两门课程成绩存放在变量math和和english中,在中,在main函数中定义如函数中定义如
19、下:下:int math,english;这两门课程成绩的输入要求在函数这两门课程成绩的输入要求在函数input中完成,而输出又要在函数中完成,而输出又要在函数output中进行,所以,调用完中进行,所以,调用完input函数后必须将两门课程成绩返回到主函函数后必须将两门课程成绩返回到主函数,再以参数的形式传递给数,再以参数的形式传递给output函数。函数。因此,因此,input函数函数必须以指针变量作为函数参数必须以指针变量作为函数参数,以便能修改主函数中变,以便能修改主函数中变量量math和和english的值。的值。思考:思考:output函数的参数定义成什么形式?函数的参数定义成什么
20、形式?运行程序运行程序(3_7)看源程序看源程序(3_7)源程序源程序指针变量作函数参数举例指针变量作函数参数举例2【例【例6-4】编写程序,输入编写程序,输入a和和b两个整数,处理后使两个整数,处理后使a中存放两中存放两者较小的那一个,者较小的那一个,b中存放两者较大的那一个,最后按中存放两者较大的那一个,最后按a、b的的顺序输出。要求:用函数实现两个数的交换。顺序输出。要求:用函数实现两个数的交换。分析分析当输入数据后,当输入数据后,a的值比的值比b大,则需要交换它们的值。大,则需要交换它们的值。流程图流程图 源程序源程序运行程序运行程序(3_8)看源程序看源程序(3_8)思考:正确吗?为
21、什么?思考:正确吗?为什么?指针变量作函数参数举例指针变量作函数参数举例2【例【例6-4】编写程序,输入编写程序,输入a和和b两个整数,处理后使两个整数,处理后使a中存放两中存放两者较小的那一个,者较小的那一个,b中存放两者较大的那一个,最后按中存放两者较大的那一个,最后按a、b的的顺序输出。要求:用函数实现两个数的交换。顺序输出。要求:用函数实现两个数的交换。再分析再分析 用函数用函数swap实现交换两个整数的值,两个整数以参数的形式实现交换两个整数的值,两个整数以参数的形式由由main函数传递给函数传递给swap函数。因为交换完以后还要把值返回函数。因为交换完以后还要把值返回给给main函
22、数,所以,函数,所以,以指针变量作为以指针变量作为swap函数的参数函数的参数。指针变量作函数参数举例指针变量作函数参数举例2【例【例6-4】编写程序,输入编写程序,输入a和和b两个整数,处理后使两个整数,处理后使a中存放两中存放两者较小的那一个,者较小的那一个,b中存放两者较大的那一个,最后按中存放两者较大的那一个,最后按a、b的的顺序输出。要求:用函数实现两个数的交换。顺序输出。要求:用函数实现两个数的交换。流程图流程图 源程序源程序运行程序运行程序(3_9)看源程序看源程序(3_9)swap函数总结函数总结void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;void swap(int*p1,int*p2)int *temp;temp=p1;p1=p2;p2=temp;void swap(int p1,int p2)int temp;temp=p1;p1=p2;p2=temp;正确错误这种方法能实现题目要求吗?这种方法能实现题目要求吗?为什么?为什么?运行程序运行程序(3_10)看源程序看源程序(3_10)本次课总结本次课总结 指针和指针变量的概念指针和指针变量的概念 指针变量的定义和赋值指针变量的定义和赋值 指针变量的运算指针变量的运算 指针变量作为函数参数的用法指针变量作为函数参数的用法下课下课