《c语言综合实验》1数组与指针v

上传人:tian****1990 文档编号:75517972 上传时间:2019-01-31 格式:PPT 页数:66 大小:609KB
返回 下载 相关 举报
《c语言综合实验》1数组与指针v_第1页
第1页 / 共66页
《c语言综合实验》1数组与指针v_第2页
第2页 / 共66页
《c语言综合实验》1数组与指针v_第3页
第3页 / 共66页
《c语言综合实验》1数组与指针v_第4页
第4页 / 共66页
《c语言综合实验》1数组与指针v_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《《c语言综合实验》1数组与指针v》由会员分享,可在线阅读,更多相关《《c语言综合实验》1数组与指针v(66页珍藏版)》请在金锄头文库上搜索。

1、1,C语言综合实验,谢颂华 ,2,C语言综合实验,指针与数组 构造数据类型 文件 线性表,3,指针与数组 基本概念 变量的指针和指针变量 指针和数组 指针和字符串 指针函数和函数的指针 指针数组 例题讲解,4,主要内容 指针的引用和运算方法 数组、函数和字符串与指针的关系 学习难点 指针变量的引用 指针作为函数参数的运用,5,基本概念,内存:内部存储器,是由存储单元组成的。 特点:存储单元是线性连续。 存储单元的最小单位是字节。,1. 内存的概念,6,地址:为了访问内存中的某个存储单元,我们要为它编号,这种编号称为内存地址。 通过地址就能够访问该地址所标识的存储单元。 内存单元的地址和内存单元

2、的内容的区别:,2. 地址的概念,int i, j, k; i=3, j=5;,i,j,k,7,变量的地址:变量在内存中占用几个连续的 字节,开始字节的地址,就是变量的地址。,2007,8,变量的指针:一个变量的地址称为该变量的指针,指针是内存地址的别名。,指针变量:若一个变量专用于存放另一个变量的地址 (指针),则该变量称为指针变量。(特殊性,指针变量的存储单元存放的不是普通数据,而是地址),注意区分“指针”和“指针变量”这两个概念。,指针的对象:当把变量的地址存入指针变量后, 我们就可以说这个指针指向了该变量。,变量的存取方法:直接存取和间接存取。,10, 数据所占有的内存单元个数是由其数

3、据类型决定的;, 首地址:即第一个内存单元的地址;, 表示地址的数与整数的区别;, 变量i、j的地址可能相邻,也可能不相邻,是由系统分配的,我们不必关心。,3. 说明, 程序中定义的每个变量在编译后都占有各自的内存单元,系统是通过内存地址对变量进行存取的;,变量的指针和指向变量的指针变量,一、指针变量的定义,例如: int *ptr1, *ptr2;,指针变量的类型:指明了该指针指向的内存空 间所存储的数据的类型。,在定义指针变量时要注意以下几个问题:, 变量名ptr2前面的“*”不能省略,如果写成 int *ptr1, ptr2; 则ptr2被定义为整型变量,而非整型指针变量。,12,定义中

4、的“*”表示所定义的变量是指针变量,但 指针变量名是ptr1、ptr2,而非*ptr1、*ptr2。,指针变量只能指向定义时所规定类型的变量。 这个规定的类型称为该指针变量的“基类型”。,如:上例中ptr1、ptr2只能指向整型变量,不能指向实型或字符型变量。其“基类型”相同,都是整型。,定义指针变量后,并未确定该变量指向何处。 即该变量的值是不确定的。在引用指针变量前 必须首先让它指向一个变量,这一点非常重要。,13,二、指针变量的运算, 指针运算符(“&”和“*” ),“&”(地址运算符) :取变量的存储地址。,“*” (引用运算符) :取指针所指向变量的内容 。,例如:&i 是求变量i的

5、地址。,ptr指向了i变量,*ptr表示i的值,即3,还可以用这种方法实现对变量的改变:,*ptr=15 ; /等价于 i=15,由此可见:通过指针运算符“*”可以引用一个变量。如:当ptr已经指向变量i后,*ptr就等同于i。,进一步理解“&”和“*”:,等价于, 指针的赋值运算(=),指针的赋值运算:把地址赋值给指针变量。,指针的赋值运算可以是以下三种方式:,使用取地址运算符,把地址值赋值给指针变量。,如:int i, *pi ; pi=,把指针变量的值赋给另一个指针变量。,如:int i,*pa,*pb; pa=,给指针变量赋值为符号常量NULL。,说明:NULL是一个空指针,表示该指针

6、变量的值没有意义。作用是为了避免对没有被初始化的指针变量的非法引用。NULL 的定义在“stdio.h”中。,如:int *pi ; pi=NULL ;,16,说明:,(1)在定义指针变量时,可以立即将一个地址值赋给指针变量,这就是指针变量的初始化。,如:float flt,*f_ptr=,(2)指针变量间的赋值和引用应保证基类型相同。,若有定义: int *p , i ; float *q , x ;,则:q= ,(3)可以将数组名或函数名赋给某些类型的指针变量;,int a10, *ip;,ip=,ip=a;,(4)不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量;,int

7、*ip;,ip=3000;,#include void main( ) int a1=11, a2=22; int *p1, *p2; p1= ,&a1,&a2,*p1,*p2,&a1,*p2,*p2,说明:多个指针可以指向同一个存储单元。但在某一时刻,一个指针变量只能指向一个存储单元,因为指针变量在某一时刻只能存放一个变量的地址值。,例:多个指针可以指向同一个存储单元,#include void main( ) int a1=11, a2=22; int *p1, *p2, *p; p1= ,&a1,&a2,*p1,*p2,&a1,&a2,*p1,*p1,&a1,*p2,例:使两个指针交换指

8、向,Eg802.cpp,#include void main( ) int a1=11, a2=22, t; int *p1, *p2; p1= ,&a1,*p1,&a2,*p2,11,22,11,例:交换两个指针变量所指向变量的值,Eg803.cpp, 移动指针的运算,指针的加减运算(+、),指针的自加自减运算(+,-,+=,-=),1指针的+、运算,说明:,指针与整型值加减的结果是指针,表示使该指针指向该指针下移或上移存储单元个数(整型值)之后的内存地址。存储单元的大小就是该指针的数据类型所需的内存大小。,例如:ptr+n (指针ptr,n为整数)这个指针值代表的内存单元的地址是:ptr+

9、n*d(其中d是指针所指向变量的数据类型所占内存字节数),即指针移动了n个元素。,指针与指针的加运算毫无意义,所以指针与指针 没有加运算。,指针与指针的减运算要求相减的两个指针属于同 一类型,其结果是整数,表示两个指针之间的数 据的个数。其结果值的计算公式是:,ptr1-ptr2=(ptr1的值- ptr2的值) /指针的数据类型所占字节数,例如: int *ptr1,*ptr2,*ptr3,x; int ary5=2,4,8,16,32; ptr1 = ,x 的值是?,3,2指针的+、 -、+=、-= 运算,+、 += :移动指针到下一个或下几个存储单元。,-、 -= :移动指针到上一个或上

10、几个存储单元。,例如:int *ptr, ary5=2,4,6,8,10 ;,ptr=ary;,ptr+=3;,ptr-;,23,三、指针变量作为函数参数,指针可以用作函数参数,这在调用函数希望改变参数的值时非常有用。,例如:编写函数,实现两个数的交换,题目:输入两个整数a、b,按大小顺序输出。,#include void swap(int x, int y) int temp; temp=x; x=y; y=temp; void main( ) int a, b; printf(“nInput a, b: “); scanf(“%d%d“, ,注意:语言中的函数调用采用“传值”方式,即单向传

11、递方式。,即:主调函数可以将实参的值传递给被调函数的形参,但不能通过改变形参的值而改变实参的值。,输入:a=5,b=8 输出:?,max=5, min=8,#include void swap(int *px, int *py) int temp; temp=*px; *px=*py; *py=temp; void main( ) int a, b, *p1, *p2; printf(“nInput a, b: “); scanf(“%d%d“, ,&a,&b,8,5,输入:a=5,b=8 输出:?,max=8, min=5,#include void swap(int *px, int *p

12、y) int *temp; *temp=*px; *px=*py; *py=*temp; void main( ) int a, b, *p1, *p2; printf(“nInput a, b: “); scanf(“%d%d“, ,错误:*temp是指针变量temp所指向的变量,但temp中并无确定的地址值,其值不确定;*temp所指向的单元也不确定。因此,对*temp赋值可能会破坏系统的正常工作状况。,修改:应该将*px的值赋给一个整型变量,用整型变量作为临时存储空间实现*px和*py的交换。,#include void swap(int *px, int *py) int *p; p=

13、px; px=py; py=p; void main( ) int a, b, *p1, *p2; printf(“nInput a, b: “); scanf(“%d%d“, ,&a,&b,&b,&a,输入:a=5,b=8 输出:?,max=5, min=8,通过函数调用得到n个要改变的值的方法:,、在主调函数中设n个变量,用n个指针变量指向它们;,、将n变量的地址作为实参传给所调用的函数的形参;,、通过形参指针变量,改变该n个变量的值;,、主调函数就可以使用这些改变值的变量;,例 编写函数,求一维数组中的最大值和最小值。,void search(int x , int n ) , int

14、*pmax, int *pmin,*pmax=*pmin=x0;,for (i=1; in; i+),if (*pmaxxi) *pmax=xi;,if (*pminxi) *pmin=xi;,int a20, max, min; for (i=0; i20; i+) scanf(“%d“,search(a, 20, ,29,指针和数组,一、数组的指针和指向数组的指针变量的概念,数组的指针 :数组在内存中的起始地址。,数组元素的指针 :数组元素的起始地址。,当指针变量指向数组或数组元素时,它就是指向数组的指针变量。,C规定:,数组名代表数组的首地址(起始地址), 即第一个元素的地址。,当指针变

15、量p指向数组时,p+1指向数组 的下一个元素。假设一个整型元素占两 个字节,p+1是使p的地址加2个字节。,如:int a10,*p ; 则:p=a ; 与 p=等价 称指针变量p指向数组元素a0,p+i、a+i 、&ai 都是ai的地址。,30,二、数组元素的引用,1. 用下标法引用数组元素,如:a3=45; b25=200;,2. 用指针法引用数组元素,如: int a10, *p, i ; p=a;,则:*(p+i)、*(a+i)代表元素ai, *(p+i)也可以写成pi,31,程序举例:输出10个元素数组中的全部元素。,方法2:通过数组名计算数组元素地址,找出元素的值 main() int a10=54,65,8,2,3,56,8,21,57,98,i; for(printf(“n“),i=0;i10;i+) printf(“%4d“,*(a+i); ,方法1:下标法 main() int a10=54,65,8,2,3,56,8,21,57,98, i; for(printf(“n“),i=0;i10;i+) printf(“%4d“,ai); ,方法3:用指针变量指向数组元素 main() int a10=54,65,8,2,3,56,8,21,57,98,*p,i;

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

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

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