版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/7/15,1,第5章指针的应用,5.1、指针概述 一、内存地址的概念 地址编码的基本单位是字节,每个字节是一个基本内存单元。 二、从内存单元中存取数据的 方法 1、通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。,2020/7/15,2,2、通过地址,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。 C+拥有在运行时获得变量的地址和操纵地址的能力
2、。变量的地址可以使用地址运算符 void main( ) int a;int *p; a=10;p= ,2020/7/15,5,5.2、指针变量的定义、赋值及使用 一、指针变量的定义 指针本身也是一种变量,须先声明后使用。 声明指针类型的变量是在声明变量的同时加上*来完成的。对应于各种类型的数据都有相应的指针类型。 *放在指针定义中时,被称为指针定义符。 放在可执行语句中的指针前被称为指针运算符,也称为“间接访问”运算符。,2020/7/15,6,指针变量的声明语句,由数据类型后跟星号,再跟随指针变量名组成。 数据类型 *指针变量名; 如:int* iptr;int *iptr; int *
3、iptr;int*iptr; 在指针定义中,一个*只能表示一个指针。 int * iptr1,iptr2; /iptr1指针变量,iptr2整型变量 int * iptr1, * iptr2;/两个指针变量,2020/7/15,7,地址和指针的关系 int x,*ptr ; x=3; ptr=/x=11 ,2020/7/15,8,二、指针变量的赋值 与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为0、NULL或一个地址。数值为0或者NULL的指针不指任何内容。数值0是可以直接赋给指针变量的唯一整数值。 1.在定义指针变量的同时进行初始化赋值,一般格式如下: 数据类型
4、*指针名初始地址;,2020/7/15,9,2.定义指针变量后,用赋值语句将其初始化。 指针变量名=地址; 可以是变量的地址、数组名、函数名等。 用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。 不能把常量或表达式的地址赋给指针变量。 不能将一个非0整数直接赋给指针变量,但可以赋整数值0,表示该指针为空指针。 例如:int *p; p=0; p为空指针,不指向任何地址。,2020/7/15,10,3.允许声明指向 void 类型的指针,该指针可以被赋予任何类型对象的地址。 例如: void *general; int *point; int i; general=,2020/7/1
5、5,11,例5.2、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int x; int *p;int *q; int a=3; int *pa= ,2020/7/15,12,#include using namespace std; void main() int x=3,*ptr=/变量x的地址 ,2020/7/15,13,三、指针变量的使用 例5.3、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int x,*p; p= ,2020/7/15,14,指
6、针在使用前要进行初始化或赋值,指针未赋值将非常危险。 #include using namespace std; void main() int x=26;int *ptr; *ptr=58;/此时ptr是一个随机地址 coutxendl; 很可能已经破坏了另一变量的值,甚至修改了函数的返回地址等。,2020/7/15,15,5.3、简单变量与指针 指针的类型是它所指向变量的类型。指针值不是整型数,在使用中必须类型匹配。如: int x=26; int *ptr= 表示将变量x的地址值作为一个整型数赋给变量*ptr,即变量x。,2020/7/15,16,因为指针是有类型的,所以给指针赋值不但要
7、是一个地址,而且应该是一个与该指针类型相符的变量的地址。或者说指针的类型是它所指向变量的类型。 float f=34.5,*fptr=/error:浮点指针赋给整型指针 将一个指针赋值给另一个指针,结果是两个指针指向一个相 同的地址单元。,2020/7/15,17,例5.4、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int x,*p; x=3; p= ,2020/7/15,18,例5.5、输入a和b两个整数,运用指针技术按先大后小的顺序输出a和b。 源程序清单: #include #include using names
8、pace std; void main(void) /利用间接访问方式来操作,2020/7/15,19,int a,b; int *p1= ,2020/7/15,20,指针变量的运算 指针的算术运算 指针加一,减一运算 是指向下一个或前一个数据。 如:y=*px+ 相当于y=*(px+) /px为一指针 指针与整数的加减运算 指针 p 加上或减去 n ,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。 这种运算的结果值取决于指针指向的数据类型。,2020/7/15,21,2020/7/15,22,pb-1,pb,pb+1,pb+2,*(pb-1),*pb,*(pb+1),*(pb+2
9、),int *pb,2020/7/15,23,#include using namespace std; void main() int n=20,*ptr= ,2020/7/15,24,关系运算 表示所指变量在内存中的位置关系 如:两个指针变量指向同一个数组中的元素时,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系 char a10; char *p1,*p2; p1=a+2; p2=a+4; p1+;p2-; 指针可以和零之间进行等于或不等于的关系运算。 例如:p=0;/表示空指针,2020/7/15,25,例5.5、编写一交换两个整型变量值的函数,并写一主函数测试。 #i
10、nclude using namespace std; void swap(int*x,int*y) int t;t=*x,*x=*y,*y=t; void main() int a=1,b=2; cout交换前: a=a,b=bendl; swap( ,2020/7/15,26,5.4、一维数组与指针 数组名可以拿来初始化指针,数组名就是数组第一个元素的地址,即对于数组a,有a= 对第i个元素可表示成以下四种: ai 、*(a+i) 、iptri 、*(iptr+i) 这四个等价关系使得数组与指针相互转换非常灵活。,2020/7/15,27,与上面相对应的有下面四个地址等价关系: int s
11、um1,sum2,sum3,sum4,sum5,*iPtr; int iArray =1,4,2,7,13,32,21,48,16,30; void main() int size,n; size=sizeof(iArray)/sizeof(*iArray); / sizeof(iArray):数组iArray所占字节数 / sizeof(*iArray):数组元素类型所占字节数 for(n=0;nsize;n+) sum1+=iArrayn;/方法1,2020/7/15,29,iPtr=iArray;/方法2 for(n=0;nsize;n+) sum2+=*iPtr+; iPtr=iArr
12、ay; /方法3 for(n=0;nsize;n+) sum3+=*(iPtr+n); iPtr=iArray; /方法4 for(n=0;nsize;n+) sum4+=iPtrn; /方法5 for(n=0;nsize;n+) sum5+=*(iArray+n); coutsum1=sum1,sum2=sum2 ,sum3=sum3,sum4=sum4 ,sum5=sum5endl; ,2020/7/15,30,例5.7、阅读如下程序: 源程序清单: #include using namespace std; void main( ) char a10=abcdefghi; char *p
13、1,*p2; p1=a; p1+=2;,2020/7/15,31,p2=a+4; /指针变量p2,直接由数组名加上4,指向数组的第五个数组元素的内存单元 if(p1p2)coutp1所指向的数组元素在p2所指向的数组元素前面!endl; else coutp1所指向的数组元素在p2所指向的数组元素后面!endl; p1+; p2-; if(p1=p2)coutp1和p2同时指向数组中的同一个元素且元素值为:*p1endl; else coutp1和p2没有指向数组中的同一个元素!endl; ,2020/7/15,32,例5.8、利用指针技术,将键盘输入的N个整数按相反的顺序存放并输出。 思路分
14、析: 分别取出数组最前面和最后面的元素,进行交换,即a0与aN-1交换;然后再分别取出a1与aN-2交换;直到交换完毕。,2020/7/15,33,源程序清单: #include #include using namespace std; int main(void) int a10,i,j,temp,*p; cout*p; p=a;,2020/7/15,34,for(i=0,j=10-1;ij;i+,j-) temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp; for(p=a;pa+10;p+) coutsetw(4)*p; coutendl; return 0;
15、 ,2020/7/15,35,例5.9、把一个整数插入到一个由小到大的有序整数序列中,并仍然保持由小到大的顺序。 设有10个整数按由小到大的顺序存放在数组a中,待插入的数放在变量x中。 #include #include using namespace std; void main(void) const int N=10; int aN+1,p,x,*t;,2020/7/15,36,cout*t; coutx; t=a;p=0; while (x*(t+p) ,2020/7/15,37,例5.10、从键盘输入整数集合a、b的元素个数和各个元素的值(不相同),计算并输出其交集。 #includ
16、e using namespace std; #include void main(void) const int M=20,N=10; int aM,bN,cM; int d,e,f=0,*pa,*pb,*pc;,2020/7/15,38,coutd; cout*pa; coute; cout*pb;,2020/7/15,39,for(pa=a,pc=c;paa+d;pa+) for(pb=b;pbb+e;pb+) if(*pa=*pb) *pc+=*pa;f+;break; cout交集c的各个元素依次为:endl; for(pc=c;pcc+f;pc+) coutsetw(3)*pc;
17、coutendl; ,2020/7/15,40,例5.11、从键盘输入整数集合a、b的元素个数和各个元素的值(不相同) ,计算并输出其并集。 #include using namespace std; #include void main(void) const int M=20,N=10; int aM,bN,cM+N; int d,e,f=0,*pa,*pb,*pc;,2020/7/15,41,coutd; cout*pa; coute; cout*pb;,2020/7/15,42,for(pa=a,pc=c;pa=a+d) *pc+=*pb; f+; cout“并集c的各个元素依次为:e
18、ndl; for (pc=c;pcc+f;pc+)coutsetw(3)*pc; coutendl; ,2020/7/15,43,例5.12、编程实现将一个数组中的数据按相反顺序存放。 思路分析:用一个子函数实现按相反顺序存放,主函数调用该子函数实现按相反顺序存放。 #include using namespace std; void invert(int *p,int n) int i,j,temp; for(i=0,j=n-1;ij;i+,j-) temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp; ,2020/7/15,44,int main(void) int a10,i; coutai; invert(a,10); for(i=0;i10;i+) coutaiendl; return 0; ,2020/7/15,45,5.5、二维数组与指针 例5.13、利用指针技术,输出如下二维数组各元素的值。 inta34= 1,2,3,4,5,6,7,8,9,10,11,12 源程序清单1: #include #include using namespace std; void main(void),2020/7/15,46, int a34=1,2,3,4,5,6,7,8,9
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 啤酒糖化工风险评估与管理模拟考核试卷含答案
- 钽铌精炼工安全文明水平考核试卷含答案
- 绝缘子制造工保密意识模拟考核试卷含答案
- 索状爆破器材制造工安全宣教能力考核试卷含答案
- 2026年新科教版初中八年级科学下册第一单元电与磁综合应用卷含答案
- 柠檬酸充填封装工安全生产基础知识强化考核试卷含答案
- 金属材涂层机组操作工诚信能力考核试卷含答案
- 公共风险管理师岗前技术基础考核试卷含答案
- 日间手术护理质量控制与安全
- 日间手术安全管理信息化应用
- 2025年高考物理试卷(黑吉辽蒙卷)(空白卷)
- JG/T 24-2018合成树脂乳液砂壁状建筑涂料
- 成人体外膜肺氧合循环辅助护理专家共识-解读与临床应用(2025版)
- 燃气工程施工课件
- 高中化学新课标知识考试题库大全
- 中国玉石工艺概论知到课后答案智慧树章节测试答案2025年春昆明冶金高等专科学校
- 教务班主任续费期工作总结
- DB36-T 1865-2023 湿地碳汇监测技术规程
- 《新媒体技术与应用(全彩慕课版)(第2版)》全套教学课件
- 红色简约风狼王梦读书分享会
- 住宅项目质量计划
评论
0/150
提交评论