版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指针1指针1主要内容指针的概念指针与地址操作符指针的声明指针的初始化指针运算指针与数组指针的指针void指针函数指针2主要内容指针的概念2校园生活举例到教务处办事教务处在校园什么位置或地址?综合办公楼4楼教务处→空间位置按空间位置行动,到达目的地任何单位有一个逻辑名称地址,还有一个物理空间地址人脑映射转换,控制行动3校园生活举例到教务处办事3物理地址与逻辑地址物理地址一般由地理区域的序号编码构成逻辑地址一般由有意义的机构或人名构成人们常常喜欢记逻辑地址广东石油化工学院广东省茂名市官渡二路139号因为逻辑地址简单、形象、易记物理地址逻辑地址4物理地址与逻辑地址物理地址一般由地理区域的序号编码构成物理地工作举例办公桌的抽屉里存放文件柜抽屉的钥匙文件柜抽屉中存放各种资料从文件柜某个抽屉中取资料如何操作?打开办公桌抽屉取出相应编号的钥匙打开文件柜抽屉拿出资料办公桌、文件柜→存储器抽屉→存储单元存储单元存放“物品”→“地址”或“数据”5工作举例办公桌的抽屉里存放文件柜抽屉的钥匙5内存:256MB0x00000000x00000010x00000020x00000030xFFFFFFF0xFFFFFFE0x00000040x00000050x00000060x00000070x00000080x0000009物理地址168‘W’3.14159charch=‘W’;intk=168;floatPi=3.14159;逻辑地址内存储器地址与数据6内存:256MB0x00000000x00000010x00地址译码器0x00000000x00000010x00000020x00000030xFFFFFFF0xFFFFFFE0x00000040x00000050x00000060x00000070x00000080x0000009物理地址编译系统逻辑地址物理地址内存:256MB‘W’1683.14159逻辑地址向物理地址变换7地0x00000000x00000010x00000020x函数整型数据首地址首地址内存储器浮点数据字符数据首地址首地址结构体数据首地址C++程序的存储地址是存放信息数据的内存单元的编号(编码)C++程序是通过名字(变量或函数名)来使用内存。这样做既直观,又方便为某个变量或者函数分配存储器空间的工作由编译程序完成存放在内存中的函数和数据都至少有一个地址我们关心的是首地址:第一个字节的地址通过地址直接使用内存较为快捷8函数整型数据首地址首地址内存储器浮点数据字符数据首地址首地址指针的概念用来存放内存地址的变量叫作指针变量,简称指针指针是C++语言中的一种数据类型,是专门用来处理地址码集合的。又叫地址类型、指针类型,由于“首地址”可以是整数变量的首地址,也可以是双精度变量首地址,指针变量也分为不同的类型指针是一个变量,应遵循“先声明,后使用”的原则9指针的概念用来存放内存地址的变量叫作指针变量,简称指针9含义:取变量的地址单目运算符结合性:自右向左含义:从某个地址中获取数据,也叫取内容运算符。单目运算符结合性:自右向左两者关系:互为逆运算取地址运算符&与指针运算符*10含义:取变量的地址含义:从某个地址中获取数据,也叫取内容存储器intx,*ipr;0x0013FF780x0013FF7C0x0013FF790x0013FF7A0x0013FF7B0x0013FF7D0x0013FF7E0x0013FF7Fxiprx=3;30x13FF78ipx=&x;*ipr=5;5直接访问:按变量地址存取变量值间接访问:通过存放变量地址的变量去访问变量11存储器intx,*ipr;0x0013FF780x0#include<iostream.h>intmax(inta,intb){ returna>b?a:b;}voidmain(){ intx=20,y=30; doublefib[1000]={0,1}; cout<<"输出变量x的地址:"<<&x<<endl; cout<<"输出变量y的地址:"<<&y<<endl; cout<<"输出数组fib[]的地址:"<<fib<<endl; cout<<"输出数组元素fib[1]的地址:"<<&fib[1]<<endl; cout<<"输出函数max()的地址:"<<max<<endl;}12#include<iostream.h>12#include<iostream.h>//输入半径求圆面积voidmain(){ doublearea,R,*dptr; dptr=&R; cout<<"输入半径:"; cin>>*dptr; dptr=&area; *dptr=3.14159*R*R; cout<<"圆面积是"<<*dptr<<endl; cout<<"圆面积是"<<area<<endl;}13#include<iostream.h>//输入半径求圆面积指针变量的声明指针变量声明语句格式:类型符*指针变量名;int*pi,*iptr;float*pf;double*pd;char*pc;int*number;char*character;float*greatnumber;14指针变量的声明指针变量声明语句格式:int*pi,*ip#include<iostream.h>intmain(){intvalue1=5,value2=15;int*mypointer;mypointer=&value1;*mypointer=10;mypointer=&value2;*mypointer=20;cout<<"value1="<<value1<<"/value2="<<value2;return0;}15#include<iostream.h>15#include<iostream.h>intmain(){intvalue1=5,value2=15;int*p1,*p2;p1=&value1;//将value1的地址赋给指针变量p1p2=&value2;//将value2的地址赋给指针变量p2*p1=10;//指针变量p1指向的变量赋予数值10*p2=*p1;//将指针变量p1指向的变量赋给指针变量p2所指向的变量p1=p2;//将指针变量p2的值赋给指针变量p1*p1=20;//指针变量p1所指向的变量赋予数值20cout<<"value1="<<value1<<"/value2="<<value2;return0;}16#include<iostream.h>16指针初始化intnumber;int*tommy=&number;intnumber;int*tommy;tommy=&number;17指针初始化intnumber;intnumber;17char*terry=“hello”; terry[4]='!‘;
*(terry+4)='!‘;18char*terry=“hello”;18指针运算赋值运算将一个指针赋值给另一个指针,结果是两个指针指向一个相同地址的单元例如:inta,*ip,*jp;jp=&a;ip=jp;结果是ip和jp都指向整数变量a19指针运算赋值运算19算术运算只进行加减算术运算,完成指针上下移动,对不同的类型,移动的单位长度不同指针算术运算符:++、--、、+、-例如:doublepi,*ptr=πptr++;表示指针ptr下移一个地址指针+整数表达式例如:ptr+3含义?指针-整数表达式例如:ptr-3含义?20算术运算20注意:递增“++”和递减“--”操作符比引用操作符“*”有更高的优先级*p++等同于*(p++)*p++=*q++;等同于*p=*q;p++;q++;++*p21注意:21指针与数组可以用指针指向数组中每个元素C++规定单写数组名表示数组的首地址例如:floata[20],*fp=a;数组名本身就当作指针常量,等于&a[0]由于数组中的元素在内存中是连续排列存放,可以通过指针±整数来指向任何元素a[0]⇔*(fp+0)a[1]⇔*(fp+1)
a[2]⇔*(fp+2)
原来通过下标存取数组元素,现在可以通过指针来实现,这样更快捷22指针与数组可以用指针指向数组中每个元素22inta[5]={168,768,468,11168,2168};int*pa=a,*pp;pa++;cout<<*pa;??pa+=3;cout<<*pa;??pp=pa-2cout<<*pp;??pp-=2cout<<*pp;??问题:指向双精度数组的指针增1实际加多少?16876846811162168a[0]a[1]a[2]a[3]a[4]0x0012FF6Cox0012FF700x0012FF740x0012FF780x0012FF7C指针指向整型数组示例23inta[5]={168,768,468,11168,#include<iostream.h>intmain(){intnumbers[5];int*p;p=numbers;*p=10;p++;*p=20;p=&numbers[2];*p=30;p=numbers+3;*p=40;p=numbers;*(p+4)=50;for(intn=0;n<5;n++)cout<<numbers[n]<<",";return0;}24#include<iostream.h>24计算机中处理数组时,实际上将A[i]转换成:
*(A+下标表达式值)即有:A[i]⇒*(A+i)因为数组名表示该数组的首地址,所以:
floatA[1000],*ptr=A;inti=0;则有:A[i]⇒*(A+i)⇒*(ptr+i)因此用指针处理数组及元素是最快捷方式25计算机中处理数组时,实际上将A[i]转换成:25例:字符串复制函数开始声明字符数组S[],T[]声明整数变量I=0S[I]!=‘\0’T[I]=S[I]I=I+1T[I]=‘\0’结束√×开始声明字符数组S[],T[]char*sp=S,*st=T;*sp!=‘\0’*st=*spst++,sp++*st=‘\0’结束√×26例:字符串复制函数开始声明字符数组S[],T[]声明整数变量#include<iostream.h>voidmystrcpy(char*destin,char*source){ while(*source!=0) { *destin=*source; source++; destin++; } *destin=0;}voidmain(){ charstring1[100]="Iamfine!"; charstring2[100];
mystrcpy(string2,string1); cout<<string2;}开始声明字符数组S[],T[]char*sp=S,*st=T;*sp!=‘\0’*st=*spst++,sp++*st=‘\0’结束√×27#include<iostream.h>voidmain问题:编写一个函数将数组清零算法分析(用指针实现)①令指针P指向数组首地址②给指针指向的元素赋0值,即:*P=0③指针P++④重复②、③直到整个数组处理完毕为止;注意循环N次,N是数组元素的个数。28问题:编写一个函数将数组清零算法分析(用指针实现)28#include<iostream.h>voidclear_array(float*ptr,intn){ float*qtr=ptr+n; while(ptr<qtr) { *ptr=0; ptr++; }}voidmain(){ floata[10]={1,2,3,4,5,6,7,8,9,10}; inti; for(i=0;i<10;i++)cout<<‘\t’<<a[i]; cout<<endl; clear_array(a,10); for(i=0;i<10;i++)cout<<‘\t’<<a[i]; cout<<"\n";}29#include<iostream.h>voidmain数组指针与指针数组char(*p)[20]与char*p[20]的区别chara[10][20],b[10][20];…if(..){a[i][j]…}else{b[i][j]…/*此分支与上一分支的唯一区别是:前者是对a,后者是对b操作*/}char(*p)[10][20];/*括号不能省略,否则p变成了指针构成的数组*/if(..){p=&a;}else{p=&b;}(*p)[i][j]…/*仅一份代码*/30数组指针与指针数组char(*p)[20]与char指针的指针chara;char*b;char**c;a='z';b=&a;c=&b;31指针的指针31void指针指针void是一种特殊类型的指针。void指针可以指向任意类型的数据,可以是整数、浮点数甚至字符串。唯一一个限制是被指向的数值不可以被直接引用(不可以对它们使用引用操作符“*”),因为它的长度是不定的,因此,必须使用类型转换操作或赋值操作来把void指针指向一个具体的数据类型。32void指针指针void是一种特殊类型的指针。void指#include<iostream.h>voidincrease(void*data,inttype){switch(type){casesizeof(char):(*((char*)data))++;break;casesizeof(short):(*((short*)data))++;break;casesizeof(long):(*((long*)data))++;break;}}intmain(){chara=5;shortb=9;longc=12;increase(&a,sizeof(a));increase(&b,sizeof(b));increase(&c,sizeof(c));cout<<(int)a<<","<<b<<","<<c;return0;}sizeof是C++的一个操作符,用来返回其参数的长度字节数常量。33#include<iostream.h>intmain函数指针当指针变量中存放了函数的入口地址,使得该指针指向这个函数时,通过该指针可调函数。一般形式:类型标识符(*函数指针变量名)();(1)或者类型标识符(*函数指针变量名)(形式参数类型说明表); (2)括号对不可缺少。最后的括号对表示该指针变量所指向的是一个函数。(1)式表明所说明的函数指针其参数个数不定;(2)式则限定了形参的个数和类型。34函数指针当指针变量中存放了函数的入口地址,使得该指针指向这个#include<iostream.h>intaddition(inta,intb){return(a+b);}intsub(inta,intb){return(a-b);}int(*minus)(int,int)=sub;intoperation(intx,inty,int(*functocall)(int,int)){intg;g=(*functocall)(x,y);return(g);}intmain(){intm,n;m=operation(7,5,addition);n=operation(20,m,minus);cout<<n;return0;}35#include<iostream.h>intopera程序中使用的变量、数组和函数必须先声明后使用,编译系统根据声明语句开辟内存空间,因此数据占用的存储空间是固定的。这种内存储器分配方法被称为静态存储分配动态存储分配(dynamicallocation)是在程序运行过程中随机获得内存存储空间的方法C++用运算符new和delete实现动态存储分配动态存储分配36程序中使用的变量、数组和函数必须先声明后使用,编译系统根据声运算符new用来申请所需的内存
<指针>=new<类型>(<初值>);也可为数组申请内存:
<指针>=new<类型>[<元素数>];运算符delete用于释放先前申请到的存储块
delete<指针>;若要释放数组的空间,必须放一个空的方括号[]在操作符delete和指向该类对象数组的指针之间int*p=newint[size];……delete[]p;
new和delete的使用37运算符new用来申请所需的内存new和delete的使用37例:利用动态数组来求斐波那挈数列的前n项#include<iostream.h>intmain(){ intn; cout<<“输入项数:"; cin>>n; int*p=newint[n];//申请数组空间 if(p==0||n<=0) {//如果没有申请到内存或数据输入有误,则返回 cout<<"Error!"<<endl; return-1; } p[0]=1; p[1]=1; cout<<p[0]<<endl; cout<<p[1]<<endl; for(inti=2;i<n;i++) { p[i]=p[i-2]+p[i-1]; cout<<p[i]<<endl; }
delete[]p; //释放数组空间 return0;}38例:利用动态数组来求斐波那挈数列的前n项#include<a+i=a[i]=*(a+i)=&a[i][0],值相等,含义不同a+i
表示第i行首地址,指向行a[i]
*(a+i)
&a[i][0],表示第i行第0列元素地址,指向列a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西省赣州市赣县三中2026届高三下学期第五次模拟化学试题含解析
- 2026纪委遴选考试题目及答案
- 2026山东潍坊高新区(上海)新纪元学校招聘教师备考题库含答案详解(突破训练)
- 2026上海徐汇区人民调解协会招聘调解秘书2人备考题库含答案详解(考试直接用)
- 2026年山东工业职业学院公开招聘高层次与高技能人才备考题库(12人)附答案详解(模拟题)
- 2026江西中医药大学资产管理处行政助理招聘1人备考题库附答案详解(典型题)
- 2026福建漳州漳浦县赤湖中心卫生院招聘3人备考题库附答案详解(完整版)
- 2026内蒙古巴彦淖尔市乌拉特中旗纪委监委面向全旗选调事业单位工作人员5人备考题库附答案详解(精练)
- 2025年脑机接口驱动的发音功能康复训练
- 2026公安推理考试题目及答案
- 2026陕西紫光辰济药业有限公司招聘5人笔试备考题库及答案解析
- 2026年注册消防工程师继续教育通关试题库附答案详解(满分必刷)
- (二模)太原市2026年高三年级模拟考试(二)语文试卷(含答案及解析)
- 2026年度职业病防治宣传周培训课件
- 2026食品安全抽查考试试题与答案
- 特种设备考核奖惩制度
- 2025浙江温州建设集团有限公司面向社会招聘38人笔试历年难易错考点试卷带答案解析2套试卷
- 油漆车间安全培训
- 第25讲-理解为王:化学反应原理综合题解法策略
- 设备管理体系要求2023
- 北京市2025国家自然科学基金委员会科学传播与成果转化中心招聘应届毕业生2人笔试历年参考题库典型考点附带答案详解(3卷合一)2套试卷
评论
0/150
提交评论