C语言第8章构造数据类型(指针1)(指针的基本概念和数组).ppt_第1页
C语言第8章构造数据类型(指针1)(指针的基本概念和数组).ppt_第2页
C语言第8章构造数据类型(指针1)(指针的基本概念和数组).ppt_第3页
C语言第8章构造数据类型(指针1)(指针的基本概念和数组).ppt_第4页
C语言第8章构造数据类型(指针1)(指针的基本概念和数组).ppt_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,1,第八章 指针,2,主要内容,1、概述 2、指针与变量 3、指针和数组 4、指针与字符串 5、数组、指针作为函数的参数 6、指针与函数 7、指针数组,3,地址运算符 & 功能:取变量地址运算符 获得操作数的地址; 单目运算符; 操作数应为各种类型的内存变量、数组元素、结构体成员等; 操作数不能是表达式、常量; 例: &a为变量a的地址。,3,4,指针运算符 * 功能 :取指针所指的变量的值 获得指针指向的内存数据 又称“间接访问运算符” 单目运算符,自右向左结合,优先级较高 操作数为具有指针(地址)意义的值,5,6,7,8,9,主要内容,1、概述 2、指针与变量 3、指针和数组 4、指针与字符串 5、数组、指针作为函数的参数 6、指针与函数 7、指针数组,10,第一节 指针概述,1、地址和指针 2、访问变量的方式 3、数据存取方式与指针,10,11,1、地址和指针,地址: 计算机内部存储器内存,是一系列连续的单元排列在一起,每一个单元有一个编号,编号从0开始,按字节编址,顺序递增。这个编号称为地址。,2000,2002,2004,地址,内存单元,内存字节,12,变量:,在程序中所定义的变量,编译系统会根据变量的类型,分配一定长度的存储空间。 例: int a = 6; /*2个字节*/; char c = a; /*1个字节*/; float b = 5.3; /*4个字节*/; double f = 3.4; /*8个字节*/;,13,变量在内存中的存放:,int a = 6;,2000,char c = a;,2002,float b = 5.3;,double f = 3.4;,2003,2007,6,97, ,2015,2001,2006,2014,标注一个变量的地址用低字节的地址编号,14,指针,指针类型就是用来存放地址的变量类型 如果我们希望变量p 用来存放地址值,那么就必须将p定义为指针类型。 反之,如果p为指针类型的变量,p只能存放地址值,而不能存放其他类型的数据。,15,2、访问变量的方式,在程序中是通过变量名来使用变量的值。 例如:printf( “%f”,b); C语言访问变量的方式,15,直接访问方式 按变量的地址存取变量的值 。 间接访问方式 按变量的地址的地址存取变量的值。,16,1、直接访问方式 按变量的地址存取变量的值。 例: scanf(“%d”,&a); printf(“%d”,a);,16,3,2000,&a:取变量a的地址,执行过程:先找变量 a的地址,例如2000; 然后从这个地址开始 取出两个字节中的数 据,如变量a的值为3, 并输出。,a,17,间接访问方式 按变量的地址的地址存取变量的值。 例:假设指针型变量pa的地址为1000,用变量pa来存放变量a的地址&a,此时pa的值为2000。 如果要得到a的值,可以先访问变量pa,得到pa的值为2000(变量a的地址),再通过地址2000找到所指存储单元中的值(a的值)。,18,例:假设指针型变量pa的地址为1000,用变量pa来存放变量a的地址&a,此时pa的值为2000。 如果要得到a的值,可以先访问变量pa,得到pa的值为2000(变量a的地址),再通过地址2000找到所指存储单元中的值(a的值)。,18,3,指针变量pa,a,2000,间接访问,&a:取变量a的地址,2000,1000,19,3、数据存取方式与指针,19,void main ( ) int i, j, k, *i_pointer; scanf(“%d%d”, ,按变量存取方式可称 “直接访问”方式,按地址存取方式可称 “间接访问”方式,存放整数 存储单元 的地址,2000,2004,2018,3000,存放 整数 值,存储单元,地址,变量,3,i,j,k,i_pointer,6,9,2000,3,20,第二节 指针与变量,1、指针变量的定义 2、指针变量的赋值 3、指针变量的引用 4、指针作为函数的参数,20,21,1、指针变量的定义,定义格式 指向的类型说明符 *指针变量名; 例: int *pt; * 指针标记。 pt 指针变量名 int pt 是指向整数类型的指针变量。,21,22,定义指针变量时,需指明: 指针变量所指向的变量的类型; 指针变量名; 在指针变量名之前,写一“*” ;,22,23,指针变量可以指向任意类型;,例:定义指针变量,分别指向: 整数类型的变量; 实数类型的变量; 双精度类型的变量; 字符类型的变量;,24,1. 定义指针变量,指向整数类型; int *p1,2. 定义指针变量,指向实数类型; float *p1,4. 定义指针变量,指向字符类型; char *p4,3. 定义指针变量,指向双精度类型; double *p3,5. 除此之外,还可以定义指向数组的指针变量、指向函数的指针变量、指向结构体的的指针变量等。,25,指针变量初始化: int a; int *p=,25,2、指针变量的赋值:,注意: 1.不允许把一个数值赋给指 针变量 int *p; p=1000; 错误! 2.被赋值的指针变量前不能 再加*说明符 *p= 错误!,26,2、指针变量的赋值:,例: int a,b; int *p1,*p2; 则: p1 = &a; p2 = &b;,意味着:,2000,2080,26,27,结论:,取地址运算( 指向指定类型的指针变量只能被赋予相同基类型的地址; 指向整型变量的指针只能被赋予整型变量的地址; 指向实型变量的指针只能被赋予实型变量的地址; ,其它同理。,27,28,地址运算符 & -取变量地址运算符 获得操作数的地址(指针); 单目运算符; 操作数应为各种类型的内存变量、数组元素、结构体成员等; 操作数不能是表达式、常量; 例: &a为变量a的地址。,28,3、指针变量的引用,29,指针运算符 * 取指针所指的变量的值 获得指针指向的内存数据 又称“间接访问运算符” 单目运算符,自右向左结合,优先级较高 操作数为具有指针(地址)意义的值,29,30,例: int i, *p; P=,30,指针运算符*和指针 定义中的标志*不是 一回事!,在声明语句中,*是类型声明的标 志,表示其后的变量是指针类型,表达式中出现的*则是一个运算符, 用以对指针变量所指的对象取值,31,3、指针变量的引用,指针变量运算符 ,31,32,指针变量的引用, 意味着取变量 a 的地址送入p中。,b = *p;,b = a;,*p = ?,12,32,33,main( ) int a,*pa; float b,*pb; a=10; b=1.5; pa= ,pa,pb,a,b,&a,&b,1.5,10,33,34,34,35,35,10,20,pa,pb,a,b,int a, b; int *pa, *pb;,pa = ,*pa = 10; b = 20;,pa = pb;,pb = ,&a等价于&*pa,*pa等价于*&a,36,4、指针变量作为函数的参数,指针变量存放的是地址值,同样可以作为函数的参数来进行“地址传送”; 实际参数可以是地址常量或指针变量; 形式参数则为指针变量。,36,37,37,38,38,引例:全局变量的作用域举例分析下面程序运行结果,例: 用指针做函数参数来实现。,40,p1,p2,temp,*p1或a,*p2或b,a的值,&b,&a,3,5,3,5,3,40,41,swap( )能否写成下面的形式呢?,这个程序能否实现两 个变量内容的交换?,41,回顾:指针变量的定义,定义格式 指向的类型说明符 *指针变量名; 例: int *pt; * 指针标记。 pt 指针变量名 int pt 是指向整数类型的指针变量。,42,回顾:指针变量的引用,指针变量运算符 ,43,44,主要内容,1、概述 2、指针与变量 3、指针和数组 4、指针与字符串 5、数组、指针作为函数的参数 6、指针与函数 7、指针数组,第三节 指针和数组,1、指向一维数组元素的指针 2、通过指针变量来引用一维数组的元素 3、指针变量的运算 4、数组元素的引用,46,1、指向一维数组元素的指针,数组名是一个地址常量; 计算机系统在处理数组时,在一个内存区域中,为数组分配一片连续的空间,并把这片区域的首地址值存入数组名中。数组名相当于地址常量。 数组名是一个基类型为数组元素的基类型的地址常量。,46,47,1、指向一维数组元素的指针,定义指针类型变量指向数组元素: 首先定义一个一维数组 a; 再定义一个指向数组元素类型的指针变量 p; 此时 p 就可以指向 a 数组的数组元素了。 例:int *p;int a5; 则:p = &a0;或 p = a,47,48,说明:,C语言中数组名代表数组的首地址; p = &a0与p = a 等价; 这里a为数组名,代表数组的首地址。 指针的类型必须等同于数组元素的类型 ; 可以在定义指针的同时赋予数组的首地址。 例如: int a8; int *p = a;,48,49,2、通过指针变量来引用一维数组的元素,引用数组元素的方法: 下标法: 用ai 来引用数组a的第i+1个数组元素; 指针法: 用*( ai ),*(pi)引用数组的第i个数组元素。 数组和指针如下定义: int a8,i; int *p = a;,49,50,3、指针变量的运算,设 P 为指针变量,则: p+ p 向后移动一个单位(地址增大) p- p 向前移动一个单位(地址减小) p+n p 向后移动 n 个单位(地址增大) p-n p 向前移动 n 个单位(地址减小),“单位”是指针的基类型所占的字节数,“单位”是什么概念?,50,51,指针变量的运算举例,设 P 为指向整数的指针变量(int *p),则: p+ p向后移动两个字节(地址增大) p- p向前移动两个字节(地址减小) p+n p向后移动2*n个字节(地址增大) p-n p向前移动2*n个字节(地址减小) “单位”是指针指向类型所占的字节数,整数时是2个字节;p变化之后指向下一个整型变量;,51,52,设 P 为指向字符型的指针变量(char *p),则: p+ p向后移动1个字节(地址增大) p- p向前移动1个字节(地址减小) p+n p向后移动1*n个字节(地址增大) p-n p向前移动1*n个字节(地址减小) “单位”是指针指向类型所占的字节数,字符型时是1个字节;p变化之后指向下一个整型变量;,52,指针变量的运算举例,53,设 P 为指向实数的指针变量(float *p),则: p+ p向后移动4个字节(地址增大) p- p向前移动4个字节(地址减小) p+n p向后移动4*n个字节(地址增大) p-n p向前移动4*n个字节(地址减小) “单位”是指针指向类型所占的字节数,实数时是4个字节;p 变化之后指向下一个整型变量;,53,指针变量的运算举例,54,3、指向数组元素的指针变量的运算,设 P 是一个指向一维数组的数组元素的指针型变量; P+ 意味着:,P移动一个单位,指向数组的下一个元素。,A0,A1,A2,A3,A4,A5,A6,A7,54,55,3、指向数组元素的指针变量的运算,设 P 是一个指向一维数组的数组元素的指针型变量,P- ,?,P 移动一个单位,指向数组的前一个元素。,A0,A1,A2,A3,A4,A5,A6,A7,55,56,设 P 是一个指向一维数组的数组元素的指针型变量,P-n 意味着?,P移动n个单位,指向本位置开始向前第n 个数组元素。例:n=3,A0,A1,A2,A3,A4,A5,A6,A7,3、指向数组元素的指针变量的运算,57,设 P 是一个指向一维数组的数组元素的指针型变量, P+n意味着?,P移动n个单位,指向本位置开始向后第n 个数组元素。例:n=3,A0,A1,A2,A3,A4,A5,A6,A7,57,3、指向数组元素的指针变量的运算,58,p+,+p:/*使p指向数组的后一个元素 */ p-,-p:/*使 p 指向数组的前一个元素 */ p+n: /*使 p 往后移 n 个元素 */ p-n: /*使 p 往前移 n 个元素 */ p-q: /*求指针变量 p 和 q 之间元素的个 数,且 p q */ p+q : /*两个地址相加,无意义,不允许 */,指针运算小结:,58,59,4、 数组元素的引用,用下标法引用数组元素: main() int a10,i; for( i = 0; i10; i+) ai = i; for(i = 0;i10;i+) printf(“%4d “,ai); ,59,60,用数组名引用数组元素,main() int a10,i; for( i = 0; i10; i+) ai = i; for( i = 0;i10;i+) printf(“%4d “,*(a+i); ,60,61,用指针变量引用数组元素,main( ) int a10,*p ,i; for(i = 0; i10; i+) ai = i; for( p = a; p(a+10); p+) printf(“%4d “,*p); ,61,62,主要内容,1、概述 2、指针与变量 3、指针和数组 4、指针与字符串 5、数组、指针作为函数的参数 6、指针与函数 7、指针数组,63,第四节 指针与字符串,63,1、字符串的表示形式 2、指向字符串指针变量的应用,64,C语言用两种方法实现一个字符串 用字符数组实现。例如: char str = “C language“; 用字符指针实现。例如: char *pstr = “C language“; 或 char *pst

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论