版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、指针和引用,指针的概念,int x30,1,2; 对数组元素xi的引用,即为对 (x对应地址sizeof(int)i) 空间的值的引用 系统通过存储空间地址访问空间所存储数据。 指针,。(未知内容空间),x,用户无权限访问, 系统报错!,指针和指针变量,变量的指针: 变量的地址 指针变量: 定义一个变量,用来存放一个内存单元的地址,称为一个指针变量(简称为指针)。,指针变量的定义,格式: * 例:int *p; p是指向整型数据的指针变量,p只能存放整型数据的地址,大小为4个字节(地址总是4个字节的); 一个指针变量只能指向一种类型的变量; 未指定指针变量的值时,其值不定(静态、文件类型除外)
2、 定义时可初始化,如 int *p=, cout“*p=”*pn; *p1+=2; cout“*p=”*pn;,p1,指针变量可执行的运算之算术运算,指针只进行加减运算 自增或自减运算 指针加或减一个整数 p n的意义是p nsizeof(T),p:指针名 n:加减的整数 T:指针类型,指针变量可执行的运算之算术运算,指针只进行加减运算 自增或自减运算 指针加或减一个整数 p n的意义是p nsizeof(T) p=p+2; p+2*sizeof(int),p,指针变量可执行的运算之算术运算,指针只进行加减运算 自增或自减运算 指针加或减一个整数 p n的意义是p nsizeof(T) p=p
3、+2; p+2*sizeof(int) cout*(p-1);,p,P-1,指针变量可执行的运算之关系运算,要求同类型的指针变量进行比较, 两个指针相同,两指针指向相同的内存单元 两个指针不同,两指针指向不同的内存单元 与0比较:表示指针变量的值是否为空。,优先级,指针运算符“*”,取地址运算符“ 则: p1=,练习输入两个整数分别给a和b,按先大后小的顺序输出a和b.,void main() int *p1,*p2,*p,a,b; cinab; p1= ,结构体类型的指针变量,struct student int number; char name10; ; student stu1; st
4、udent *s=,通过指针访问结构体类型的成员使用指向运算符,如s-number。,指针和数组,数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。 引用数组元素可以用下标法(如a3),也可以用指针法,即通过指向数组元素的指针找到所需的元素,使用指针占用内存少,运行速度快,目标程序质量高。,指针和一维数组,int a10, *p,*q; p= a、p、q都是数组a的起始地址,但是a没有空间,可视为常量,不能做自增、自减操作!,q,指针和一维数组,(1) p+i和a+i就是ai的地址,实际地址为:a+i*sizeof(int); (2) *(p+i)或*(a+i)就是p+i或a+i所
5、指向的数组元素,即ai或pi; (3) 可以对指针变量进行运算,但不允许对数组名进行运算。用指针访问数组元素时,编译程序不作下标是否越界的检查。,指针和一维数组(例),(1)执行下列语句后,*(p+2)的值为() char s= “ab”,*p; p=s; (2)具有相同类型的指针变量p和数组a,不能进行的操作是() Ap=a B. p=a0 C. p=in-1;i+) for(j=i+1;jn;j+) if(ajai) t=ai; ai=aj; aj=t; ,int *p=a; for(i=0;in-1;i+) for(j=i+1;jn;j+) if(*(p+j)*(p+i) t=*(p+i
6、); *(p+i)=*(p+j) *(p+j)=t; ,课堂练习用指针查找一维数组中的最大值,int *p_max=_; for(i=1;in-1;i+)if(_ai) p_max=_; cout“max one is:”_;,指针和二维数组,二维数组的各个元素是按行连续存放的 二维数组可以看成特殊的一维数组,这个特殊的一维数组的元素又是一个一维数组。,指针和二维数组二维数组的相关地址,“*”出现在行地址前,将地址“降”为元素地址 “ 对字符型指针赋值前,不允许对指针输入字符串,指针和字符串注意点,字符串不能直接赋值给字符数组,但字符串可直接赋值给字符指针 char *s ; s=“ABC”
7、; 字符数组的起始地址不允许改变,指针的值可以改变 不能将指针赋给数组名,可以将数组名赋给字符型指针,课堂练习,设有“char a6,*p=a;”下列表达式中正确的赋值语句是() Aa6= “Hello”; B. a= “Hello”; C. *p= “Hello”; D. p=”Hello”; 程序的输出是? void main() char *p1= “abcd”; char str50= “xyz” strcpy(str+2,p1+2); coutstrendl; ,课堂练习,void main(void) char str=abcdca123123; int count128,i; c
8、har *p=str; for(i=0;i127;i+) counti=0; while(*p) count*p+; for(i=0;i127;i+) if (counti) cout(char)i countiendl; ,指针数组,若干个同类型指针变量的集合,其定义形式为: 类型 *数组名数组长度说明 int a3=10,20,30; int *p3; for(int i=0;i3;i+) pi= *pi与ai等价!,指针数组,char *s4=“open”,”new”,”save”,”save as”; cout*s1ns1; ?用字符数组如何存放这四个字符串,指针数组,char s48
9、= “open”,”new”,”save”,”save as”; 用于存储多个字符串时,字符型指针数组相对于二维字符数组大大节省了存储空间! 可利用指针数组实现 字符串的排序! P152 例8.9,指向一维数组的指针变量(行指针),int a34=1,2,3,4,5,6,7,8,9,10,11,12,*p; p=a; 是否正确?为什么 只有行指针可以用行地址赋值! int (*p)4; /p是指向四个元素空间的行地址 p=a; /a的列数必须和p数组的大小一致 p=p+1; cout(*p)2; *(*(p+i)+j)、*(pi+j)、*(*(a+i)+j)、*(ai+j) 等价!,指向指针的
10、指针变量(多级指针),如果变量p中存放的是指针变量q的地址,那么p就指向了指针变量q,指向指针数据的指针变量,简称为指向指针的指针。 例: char *p,*q,c; q=,A,B,指针和函数之指针作参数,指针作为函数的参数时,传递给函数的是某一个变量的地址,这种情况又称为地址传递。 void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;,swap( *(t+1)=*s; return t; void main(void ) char ch= a, *p,*q; p=,指针和函数之指针作返回值,42,练习,(1)如下语
11、句: int c45, (*cp)5; cp=c; 则以下哪个是对数组c的元素的正确引用。 Acp+1 B. *(cp+3) C. *(cp+1)+3 D. *(*cp+2) (2) void main(void) char *n4=“China”, “Japan”, “England”, “Germany”; char *p=n; int i; for(i=0;i4;i+,p+) cout*(*p+2)endl; ,43,指针和函数之函数指针,函数的指针:指一个函数的入口地址(可用函数名表示),当一个指针变量的值为函数的入口地址时,称其为指向函数的指针变量。 定义: 函数返回值的类型 (*变
12、量名)(参数表); 例如: int (*p)(int ,int) 因函数名表示该函数的入口地址(在内存中的起始地址),可将函数名赋给指向函数的指针变量。,44,函数指针,例:int sum(int x, int y) int z; z=x+y; return z; void main(void) int a,b; int (*p)(int ,int); cinab; p=sum; coutp(a,b)(*p)(a,b); ,45,动态分配内存空间,new运算符 格式:p=new type; type要与p的类型一致,分配type类型大小的空间 p=new type(value); 将value
13、作为分配空间的初始化值 p=new type ; 分配指定类型的数组空间 用new动态分配到的内存空间是随机值,分配不成功时返回0值表动态分配内存失败,若成功则返回所分配空间的首地址赋给指针变量。,46,动态分配内存空间,delete运算符 将动态分配的内存空间归还给系统 在程序中用new动态分配内存空间后,若没有用delete释放相应的内存空间,程序执行结束后,这部分内存空间将从系统中丢失直到重新启动计算机后进行初始化才能使用。 格式:delete pointer; 将pointer所指向的内存空间归还给系统 delete 表达式pointer; 将pointer所指向的一维数组空间还给系统
14、,释放后不再返回任何值,不能再使用。,47,引用,引用是一种特殊的类型,定义引用型变量,本质是给一个已定义的变量起一个别名,系统不为引用类型变量分配内存空间,只是使用引用类型变量与相关联的变量使用同一个内存空间。,例: int count; int count必须是一个已定义过的变量,rec是变量count的别名,使用相同的空间。,1. 在定义引用类型的变量时,必须用同类型的已定义的变量对它初始化,不同类型的变量以及常量不可对它初始化!如:,int /错误,不可用常量初始化,引用之注意,2. 可以将引用与指针变量所指向的数据相关联,也可以将引用与数组中的元素相关联。如:,3. 可以定义指针类型
15、的引用。,引用之注意,int *pi=new int(3); int ,int *pi=new int;int * ,4. 可以定义对引用类型变量的引用,但不能定义引用的引用,也不能定义引用指针和引用数组。,引用之注意,如: int i , /错误,不能定义引用数组,51,引用和函数,(1)引用类型的参数 引用传递,与地址传递类似 注意:在调用参数为引用类型的函数时,引用类型的形参所对应的实参必须为变量。 (2)返回引用类型 可对引用类型的返回值作赋值操作,但是,只能返回静态或全局变量的引用!,const类型(常值)指针,1.指针所指向的数据为常值 定义方式 const char *s=Hello!; / const char *s; s=Hello!; 或char const *s=Hello!; 操
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校室外管网工程施工组织设计模板
- 公司应急预案类型(3篇)
- 下关茶厂营销方案(3篇)
- 医学检测营销方案(3篇)
- 停电如何应急预案(3篇)
- 公司师徒活动策划方案(3篇)
- 宴会包厢施工方案(3篇)
- 房屋横梁施工方案(3篇)
- 支架预压施工方案(3篇)
- 日常团建活动方案策划(3篇)
- (河北高考卷)2024年河北省普通高中学业水平选择性考试高考物化生+政史地真题试卷及答案
- 植物组织培养-植物组织培养的基本技术
- 2025年国家保安员资格考试模拟100题及答案
- 2025年宁波职业技术学院单招职业倾向性测试题库及答案(历年真题)
- 结构仿生学 课件 第5章 结构仿生学典型应用案例
- 纯英文版高三数学试卷
- 历年中职高考《农业经营与管理》考试真题题库(含答案)
- DJG330110-T 0101-2022 电动自行车充换电站建设及运营管理规范
- 9F级立式余热锅炉模块吊装工法
- 第三单元名著导读《经典常谈》课件-部编版语文八年级下册
- (完整)WORD-版本核心高考高频688词汇(高考高频词汇)
评论
0/150
提交评论