第8章善于利用指针教学讲义

上传人:yuzo****123 文档编号:140278462 上传时间:2020-07-28 格式:PPT 页数:213 大小:1.58MB
返回 下载 相关 举报
第8章善于利用指针教学讲义_第1页
第1页 / 共213页
第8章善于利用指针教学讲义_第2页
第2页 / 共213页
第8章善于利用指针教学讲义_第3页
第3页 / 共213页
第8章善于利用指针教学讲义_第4页
第4页 / 共213页
第8章善于利用指针教学讲义_第5页
第5页 / 共213页
点击查看更多>>
资源描述

《第8章善于利用指针教学讲义》由会员分享,可在线阅读,更多相关《第8章善于利用指针教学讲义(213页珍藏版)》请在金锄头文库上搜索。

1、第8章 善于利用指针,8.1 指针是什么 8.2 指针变量 8.3 通过指针引用数组 8.4 通过指针引用字符串 8.5 指向函数的指针 8.6 返回指针值的函数 8.7 指针数组和多重指针 8.8 动态内存分配与指向它的指针变量 8.9 有关指针的小结,8.1 指針是什么,如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元 编译系统根据程序中定义的变量类型,分配一定长度的空间 例如,VC+为整型变量分配4个字节,对单精度浮点型变量分配个字节,对字符型变量分配个字节,8.1 指针是什么,内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。 在地址所标

2、识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。 由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。 将地址形象化地称为“指针”,务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别 例如:,int i=3,j=6,k;,k=i+j;,从这里取3,将9送到这里,从这里取6,直接存取,int i=3,j=6,k;,定义特殊变量i_pointer,将i的地址存到这里,间接存取,i_pointer=,*i_pointer=50;,50,i,2000,3,2000,i_pointer,*i_pointer,2000,3,直接存取,间接存取,为了表示将数值送到变量中,可以有

3、两种表达方法: (1) 将3直接送到变量i所标识的单元中,例如:i=3; (2) 将3送到变量i_pointer所指向的单元(即变量i的存储单元),例如:*i_pointer=3; 其中*i_pointer表示i_pointer指向的对象,指向就是通过地址来体现的 假设i_pointer中的值是变量的地址(2000),这样就在i_pointer和变量之间建立起一种联系,即通过i_pointer能知道i的地址,从而找到变量i的内存单元,由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元 将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元,一个变量的地址称为该变量的“指针

4、” 例如,地址2000是变量的指针 如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量” i_pointer就是一个指针变量。指针变量就是地址变量,用来存放地址的变量,指針变量的值是地址(即指针),“指针”和“指针变量”是不同的概念 可以说变量i的指针是2000,而不能说i的指针变量是2000 指针是一个地址,而指针变量是存放地址的变量,8.2 指针变量,8.2.1使用指针变量的例子 8.2.2 怎样定义指针变量 8.2.3 怎样引用指针变量 8.2.4 指针变量作为函数参数,8.2.1使用指针变量的例子,例8.1 通过指针变量访问整型变量。 解题思路:先定义2个整型变量,

5、再定义2个指针变量,分别指向这两个整型变量,通过访问指针变量,可以找到它们所指向的变量,从而得到这些变量的值。,#include int main() int a=100,b=10; int *pointer_1, *pointer_2; pointer_1= ,定义两个指针变量,使pointer_1指向a,使pointer_2指向b,直接输出变量a和b的值,间接输出变量a和b的值,#include int main() int a=100,b=10; int *pointer_1, *pointer_2; pointer_1= ,此处*与类型名在一起。此时共同定义指针变量,此处*与指针变量一

6、起使用。此时代表指针变量所指向的变量,8.2.2 怎样定义指针变量,定义指针变量的一般形式为: 类型 * 指针变量名; 如:int *pointer_1, *pointer_2; int是为指针变量指定的“基类型” 基类型指定指针变量可指向的变量类型 如pointer_1可以指向整型变量,但不能指向浮点型变量,8.2.2 怎样定义指针变量,下面都是合法的定义和初始化: float *pointer_3; char *pointer_4; int a,b; int *pointer_1=,*pointer_1 错误,pointer_3 错误,pointer_1 正确,pointer_32000;

7、 错误,8.2.3 怎样引用指针变量,在引用指针变量时,可能有三种情况: 给指针变量赋值。如:p=,使p指向a,*p相当于a,以八进制输出a的地址,8.2.3 怎样引用指针变量,要熟练掌握两个有关的运算符: (1) 取地址运算符。 (把1赋给a),例8.2 输入a和b两个整数,按先大后小的顺序输出a和b。 解题思路:用指针方法来处理这个问题。不交换整型变量的值,而是交换两个指针变量的值。,#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:); scanf(“%d,%d”, ,a,b,p1,p2,p,5,9, prin

8、tf(“integer numbers:); scanf(“%d,%d”, ,a,b,p1,p2,p,5,9, printf(“integer numbers:); scanf(“%d,%d”, ,a,b,p1,p2,p,5,9, printf(“integer numbers:); scanf(“%d,%d”, ,a,b,p1,p2,p,5,9, int a,b; int*pointer_1,*pointer_2; printf(please enter a and b:); scanf(“%d,%d”, ,a,b,pointer_1,5,9, temp=*p1; *p1=*p2; *p2=

9、temp; ,a,b,pointer_1,5,9, temp=*p1; *p1=*p2; *p2=temp; ,void swap(int *p1,int *p2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp; ,错! 无确定的指向,#include int main() if (ab) swap(a,b); printf(“max=%d,min=%dn”,a,b); return 0; void swap(int x,int y) int temp; temp=x; x=y; y=temp; ,错! 无法交换a,b,a,b,5,9,x,y,5,9,9,5

10、,如果想通过函数调用得到个要改变的值: 在主调函数中设个变量,用个指针变量指向它们 设计一个函数,有n个指针形参。在这个函数中改变这个形参的值 在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的地址传给该函数的形参 在执行该函数的过程中,通过形参指针变量,改变它们所指向的个变量的值 主调函数中就可以使用这些改变了值的变量,例8.4 对输入的两个整数按大小顺序输出。 解题思路:尝试调用swap函数来实现题目要求。在函数中改变形参(指针变量)的值,希望能由此改变实参(指针变量)的值,#include int main() void swap(int *p1,int *p2); in

11、t a,b; int*pointer_1,*pointer_2; scanf(%d,%d, ,void swap(int *p1,int *p2) int *p; p=p1; p1=p2; p2=p; ,错! 只交换形参指向,注意:函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。 要善于利用指针法。,例8.5 输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。 解题思路:采用例8.3的方法在函数中改变这3个变量的值。用swap函数交换两个变量的值,用exchange函数改变这3个变量的值

12、。,#include int main() void exchange(int *q1, int *q2, int *q3); int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d, ,调用结束后不会改变指针的指向,void exchange(int *q1, int *q2, int *q3) void swap(int *pt1, int *pt2); if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3); void swap(int *pt1, int *pt2) int tem

13、p; temp=*pt1; *pt1=*pt2; *pt2=temp; ,交换指针指向的变量值,8.3通过指针引用数组,8.3.1 数组元素的指针 8.3.2 在引用数组元素时指针的运算 8.3.3 通过指针引用数组元素 8.3.4 用数组名作函数参数 8.3.5 通过指针引用多维数组,8.3.1 数组元素的指针,一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址 指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中) 所谓数组元素的指针就是数组元素的地址,可以用一个指针变量指向一个数组元素 int a10=1,3,5,7,9,11,13,15,17,19; int *p

14、; p=,等价于p=a;,等价于int *p=a; 或int *p=,注意:数组名a不代表整个数组,只代表数组首元素的地址。“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。,8.3.2 在引用数组元素时指针的运算,在指针指向数组元素时,允许以下运算: 加一个整数(用+或+=),如p+1 减一个整数(用-或-=),如p-1 自加运算,如p+,+p 自减运算,如p-,-p 两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义),(1) 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数

15、组中的上一个元素。 float a10,*p=a; 假设a0的地址为2000,则 p的值为2000 p+1的值为2004 P-1的值为1996,越界,(2) 如果的初值为 int i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d, ,(2) 通过数组名计算数组元素地址,找出元素的值 #include int main() int a10; int i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d, ,scanf(%d,a+i);,(3)

16、 用指针变量指向数组元素 #include int main() int a10; int *p,i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d, ,for(p=a;p(a+10);p+) scanf(%d,p);,for(p=a;p(a+10);a+) printf(“%d ”,*a); 错!,3种方法的比较: 第(1)和第(2)种方法执行效率相同 编译系统是将ai转换为*(a+i)处理的,即先计算元素地址。 因此用第(1)和第(2)种方法找数组元素费时较多。,3种方法的比较: 第(3)种方法比第(1)、第(2)种方法快 用指针变量直接指向元素,不必每次都重新计算地址,像p+这样的自加操作是比较快的 这种有规律地改变地址值(p+)能大大提高执行效率,3种方法的比较: 用下标法比较

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号