善于利用指针1课件.pptx
《善于利用指针1课件.pptx》由会员分享,可在线阅读,更多相关《善于利用指针1课件.pptx(61页珍藏版)》请在三一办公上搜索。
1、C语言程序设计,Soochow University,1,主要内容,地址和指针的概念变量的指针和指向变量的指针变量数组的指针和指向数组的指针变量字符串的指针和指向字符串的指针变量函数的指针和指向函数的指针变量返回指针值的函数指针数组和指向指针的指针有关指针的数据类型和指针运算的小结习题,C语言程序设计Soochow University1主要内,C语言程序设计,Soochow University,2,8.1 指针是什么,C语言程序设计Soochow University28.1,C语言程序设计,Soochow University,3,地址和指针的概念,变量定义时的内存分配如果在程序中定义了
2、一个变量,在编译时就给这个变量分配内存单元。系统根据程序中定义的变量类型,分配一定长度的空间。内存单元的地址和内存单元的内容这两个概念的区别内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。在地址所标志的内存单元中存放数据,这相当于旅馆中各个房间中居住旅客一样。,C语言程序设计Soochow University3地址和,C语言程序设计,Soochow University,4,地址和指针的概念,变量的“直接访问”方式通过变量名来访问在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后己经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。变量的
3、“间接访问”方式保存变量地址的变量:i_pointer=这时,i_pointer的值就是2000,即变量i所占用单元的起始地址。变量的“间接访问”过程:先找到存放“i的地址”的变量,即i_pointer,从中取出i的地址(2000),然后到2000、2001字节取出i的值(3)。,C语言程序设计Soochow University4地址和,C语言程序设计,Soochow University,5,地址和指针的概念,“直接访问”和“间接访问”方式下变量的存储过程为了表示将数值3送到变量中,可以有两种表达方法:(1) 将3送到变量i所标志的单元中。(2) 将3送到变量i_pointer所“指向”的
4、单元(即i所标志的单元)中。见上图。所谓“指向”就是通过地址来体现的。“指针”和“指针变量”一个变量的地址称为该变量的“指针”。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址)。请区分“指针”和“指针变量”这两个概念。,C语言程序设计Soochow University5地址和,C语言程序设计,Soochow University,6,8.2 指针变量,C语言程序设计Soochow University68.2,C语言程序设计,Soochow University,7,定义一个指针变量,指针变量也必须先定义后使用定义指
5、针变量的一般形式:基类型 *指针变量名指针变量的基类型:用来指定该指针变量可以指向的变量的类型。指针变量只能用来指向和其基类型相同类型的变量,如基类型为int的指针变量只能用来指向整型变量,绝对不能指向实型变量。int*pointer_1,*pointer_2, a;用赋值语句可使一个指针变量指向另一个变量,C语言程序设计Soochow University7定义一,C语言程序设计,Soochow University,8,在定义指针变量时要注意两点,(1) 指针变量前面的“*”,表示该变量的类型为指针型变量。注意:指针变量名是pointer_1、pointer_2,而不是*pointer_1
6、、*pointer_2。(2) 在定义指针变量时必须指定基类型。例如只有整型变量的地址才能放到指向整型变量的指针变量中。,C语言程序设计Soochow University8在定义,C语言程序设计,Soochow University,9,指针变量的引用,指针变量中只能存放地址(指针),不要随便将一个整型常量(或任何其他非地址类型的数据)赋给一个指针变量。两个有关的运算符(1) ,注意:规则修改:指针必须先定义并且初始化后,才可以使用,C语言程序设计Soochow University9指针变,C语言程序设计,Soochow University,10,指针变量的引用程序举例,例:通过指针变量
7、访问整型变量。main( ) int a,B, *pointer_1, *pointer_2; /*这里出现*表示指针定义*/ a=100;B=10; /*把变量a的地址赋给pointer_1,不是*pointer_1= ,运行结果为:100,10100,10,C语言程序设计Soochow University10指针,C语言程序设计,Soochow University,11,对“&”和“*”运算符的深入说明,(1) 如果已执行了“pointer_1=”语句,若有&*pointer_1它的含义是什么?&*pointer_1相当于&apointer_2 = &*pointer_1pointer
8、_2 = pointer_1,C语言程序设计Soochow University11对“,C语言程序设计,Soochow University,12,(2) *&a的含义是什么?与a等价; *&a和*pointer_1的作用是一样的(假设已执行了“pointer_1=&a”),它们等价于变量a。即*&a与a等价,见图(3) (*pointer_1)+相当于a+。注意括号是必要的,如果没有括号,就成为了*pointer_1+,+和*为同一优先级别,相当于先做*pointer_1,然后做pointer_1+,对“&”和“*”运算符的深入说明,C语言程序设计Soochow University12(
9、2,C语言程序设计,Soochow University,13,例: 输入a和B两个整数,按先大后小的顺序输出a和B。,main()int *p1,*p2,*p, a, B;scanf ( %d,%d, ,运行情况如下:5,9a=5,B=9max=9,min=5 当输入a=5,B=9时,由于aB,将p1和p2交换。交换前的情况见图 (a),交换后见图(b)。,结论:在使用指针时,我们要清楚操作的是指针本身,还是指针所指向的变量,C语言程序设计Soochow University13例:,C语言程序设计,Soochow University,14,函数的参数回顾,形式参数和实际参数二者具有各自独
10、立的内存空间C语言中函数参数传值是单向的实际参数 形式参数例如:,void swap(int n1,int n2) int temp; if (n1 n2) temp = n1; n1 = n2; n2 = temp;,输入: 9 5,输出: a=9; b=5,输出: a=9; b=5,C语言程序设计Soochow University14函数,C语言程序设计,Soochow University,15,函数的参数回顾,函数的调用过程首先把a、b的值复制到swap函数的堆栈区间,并赋值给行参n1、n2.交换n1、n2的值。返回。,结果被调函数进行的操作结果无法反应在主调函数中。用传地址的形式,
11、C语言程序设计Soochow University15函数,C语言程序设计,Soochow University,16,指针作为函数参数,指针作为函数参数将一个变量的地址传到另一个函数中。例如:,void swapp(int *n1,int *n2) int temp; if (*n1 *n2) temp = *n1; *n1 = *n2; *n2 = temp;,输入: 9 5,输出: a=9; b=5,输出: a=5; b=9,C语言程序设计Soochow University16指针,C语言程序设计,Soochow University,17,指针作为函数参数,函数的调用过程首先把a、b
12、的地址值复制到swapp函数的堆栈区间,并赋值给行参n1、n2.交换n1、n2所指向内存单元的值。返回。,结果被调函数进行的操作结果反应在主调函数中。被调函数实际上是在主调函数的堆栈区间中进行的操作实际是一种地址传递方式,C语言程序设计Soochow University17指针,C语言程序设计,Soochow University,18,指针作为函数参数,指针变量作为函数参数典型错误举例一swap(int *n1,int *n2) int*temp;*temp=*n1; *n1=*n2; *n2=*temp;问题:temp没有初始化,指向的内存单元是不确定的对没有初始化的指针赋值非常危险!,
13、/*此语句有问题*/,C语言程序设计Soochow University18指针,C语言程序设计,Soochow University,19,指针作为函数参数,指针变量作为函数参数典型错误举例二swap(int *n1,int *n2) int*p; p=n1;n1=n2;n2=p;,问题交换的只是两个形参所指向的内存单元。,C语言程序设计Soochow University19指针,C语言程序设计,Soochow University,20,指针变量作为函数参数,C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也要遵循这一规则,这时的值是指针的值,也就是地址
14、值。调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。运用指针变量作参数,可以从函数调用中得到多个变化了的值。如果不用指针变量是难以做到这一点的。参考下例:,C语言程序设计Soochow University20指针,C语言程序设计,Soochow University,21,指针作函数参数的实例,main() int a,B,C,*p1,*p2,*p3;scanf(%d,%d,%d,,swap(int *pt1, int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp;,exchange(int *q1, int *q2,
15、 int *q3) if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3);,运行情况如下: 9,0,10 10,9,0,C语言程序设计Soochow University21指针,指针举例,编写一个函数,实现将大写字母转换从小写字母,小写字母转换成大写字母。在main函数中测试该函数的正确性。,C语言程序设计,Soochow University,22,指针举例编写一个函数,实现将大写字母转换从小写字母,小写字母,C语言程序设计,Soochow University,23,8.3 通过指针引用数组,C语言程
16、序设计Soochow University238.,C语言程序设计,Soochow University,24,数组的指针和指向数组的指针变量,数组的指针是指数组的起始地址数组元素的指针是数组元素的地址。指向数组元素的指针定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。例如:int a10; int *p; p=,C语言程序设计Soochow University24数组,C语言程序设计,Soochow University,25,指向数组元素的指针,C语言规定数组名代表数组的首地址,也就是第0号元素的地址。下面语句等价:p=”的作用是“把a数组的首地址赋给指针变量p
17、”,而不是“把数组a各元素的值赋给p”。,C语言程序设计Soochow University25指向,C语言程序设计,Soochow University,26,通过指针引用数组元素,通过指针对数组元素赋值,如:*p=1;如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素(而不是将p值简单地加1)。,C语言程序设计Soochow University26通过,C语言程序设计,Soochow University,27,数组元素指针使用的进一步理解,如果p的初值为&a0,则:(1) p+i和a+i就是ai的地址(2) *(p+i)或*(a+i)是p+i或a+i所指向的数组元
18、素,即ai。例如,*(p+5)或*(a+5)就是a5。(3) 指向数组的指针变量也可以带下标,如pi与*(p+i)等价数组元素引用的两种方法:(1) 下标法,如ai或pi形式,p是指向数组的指针变量,其初值p=a。(2) 指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组的指针变量,其初值p=a。,C语言程序设计Soochow University27数组,C语言程序设计,Soochow University,28,数组元素指针使用例子,例: 输出数组中的全部元素。假设有一个整型数组a,有10个元素。要输出各元素的值有三种方法:,(1) 下标法。main( )int a10;
19、inti; for(i=0;i10;i+) scanf(%d,,(2)数组名方法main( )int a10; inti; for(i=0;i10;i+) scanf(%d,,(3)指针方法main( )int a10; inti; int *p;for(i=0;i10;i+) scanf(“%d”,p+i);printf(n);for(p=a;p(a+10);p+) printf(%d ,*p);,C语言程序设计Soochow University28数组,C语言程序设计,Soochow University,29,数组元素的指针变量使用过程中的注意事项,(1) 指针变量可以实现使本身的值改
20、变,数组名是否也可以?例如,上述第(3)种方法是用指针变量p来指向元素,用p+使p的值不断改变,这是合法的。如果不用p而使a变化(例如,用a+)行不行呢?答案是不行的,因为a是数组首地址,这个地址在编译期就定下来了,在程序运行过程中始终会保持不变。程序中如果出现a+,编译器在编译的时候就会报错。(2) 要注意指针变量的当前值。(3) 注意数组下标越界问题 (4) 注意指针变量的运算(见P236),C语言程序设计Soochow University29数组,C语言程序设计,Soochow University,30,例:通过指针变量输出a数组的10个元素请检查以下程序的正确性:main( ) i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 善于 利用 指针 课件

链接地址:https://www.31ppt.com/p-1329390.html