经典C语言课件 谭浩强版 第十章。指针

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第十章指针10.1地址和指针的概念10.2指针定义和引用10.3指针与数组10.4指针与字符串§10.1地址和指针的概念一、数据的存取1、内存地址内存的每个字节都有一个编号,这个编号称为“内存地址”。…低地址高地址2000200220043000程序中的每个数据都对应着内存中的一个地址,从该地址开始的一个或多个字节用来存放该数据。inti,j,k;ijk2、内存单元的地址和内存单元的内容的区别:若i=3,j=5;00000011000000000000010100000000从图中可以看出它们的区别。程序编译后已经没有i、j、k这些变量名了,而是将变量名转换为变量的地址,计算机通过内存地址对变量进行存取。二、直接访问和间接访问1、直接访问方式:…低地址高地址2000200220043000ijk00000011000000000000010100000000①、i=3;②、j=i+2;③、printf(%d,i);④、scanf(%d,&i);⑤、k=i+j;如何执行?0000100000000000按变量的地址存取变量的方式2、间接访问方式:C语言中可以定义整型变量、实型变量、字符型变量,各自存放相应类型的数据;另外还可以定义和使用一种特殊类型的变量,用来存放变量的地址。…低地址高地址2000200220043000ijk000000110000000000000101000000000000100000000000假设已经定义变量ip用来存放整型变量的地址,它被分配到内存单元3000和3001。ip通过执行语句:ip=&i;将整型变量i的地址存放到变量ip中,即ip的值为变量i所对应的内存单元的起始地址2000。2000现在要存取i的值可以这样做:先找到存放i的地址的内存单元地址(3000和3001),从中取出变量i的地址(2000),然后再对2000和2001单元进行存取——这就称为间接访问。3、关于“指向”的含义:变量ip的值为2000,即变量i的地址,这样就在ip和i之间建立了一种联系:通过变量ip知道变量i的地址,从而找到变量i的内存单元,因此说变量ip指向变量i,用箭头表示这种“指向”关系。20003000ip2000i4、为了表示将数值10送到变量i中,可以有两种表示方法:①、将10送到变量i所标志的单元中;2000i10②、将10送到变量ip所指向的单元中;20003000ip2000i10三、指针与指针变量通过地址能找到所需的变量单元,可以说:地址“指向”该变量单元。因此,把一个变量的地址称为该变量的“指针”。…低地址高地址2000200220043000ijk000000110000000000000101000000000000100000000000ip2000如果一个变量专门用来存放另一个变量的地址,则称它为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址)。注意区分“指针”和“指针变量”这两个概念。四、说明①、程序中定义的每个变量在编译后都占有各自的内存单元,系统是通过内存地址对变量进行存取的;②、数据所占有的内存单元个数是由其数据类型决定的;③、首地址:即第一个单元的地址;④、表示地址的数与整数的区别;⑤、变量i、j的地址可能相邻,也可能不相邻,是由系统分配的,我们不必关心。§10.2指针变量的定义和引用10.2.1概述1、指针运算符:*为了表示指针变量和它所指向的变量之间的联系,用“*”表示指向的关系。如:ip代表指针变量,*ip表示ip所指向的变量。即*ip也代表一个变量。例:①、若:ip=&i;i=5;*ip=5;结论:*ip与i等价。②、x=i+1;x=*ip+1;2、取地址运算符:&它与一个变量连用,以得到该变量的内存地址。3、说明:①、取地址运算符只能作用于变量:&x,&a[5];不能作用于常量、表达式或寄存器变量:&25,&(i+1);②、不能把整数赋值给一个指针变量:ip=3000;③、不能把一个指针变量的值赋值给一个整型变量:x=ip;10.2.2指针变量的定义与赋值一、指针变量的定义1、格式:类型名*指针变量名其中:①、“*”表示定义的是指针变量;②、“类型名”用来指定该指针变量可以指向的变量的类型;2、例:inti,*ip;int*p1,*p2;floatx,*xp;char*cp1,*cp2;3、说明:①、“*”只表示定义的变量为指针变量,但指针变量名中并不包含“*”;*是指针变量的标志,不可丢掉;②、指针变量定义时,指定了它所指向的变量的数据类型;ip=&i;p1=&i;xp=&i;cp1=&x;xp=&x;指针变量定义时必须指定其所指向的变量的数据类型,而且使用过程中只能指向同一种类型的变量。③、指针变量定义后,系统为变量分配一个存储单元,用来存放地址。④、指针变量定义后,若不赋值,其值是不确定的。二、指针变量的赋值1、赋值语句:inti,j,*p1,*p2;p1=&i;p2=&j;charch,*cp1,*cp2;cp1=&ch;cp2=&ch;2、初始化:intx=4;intx;x=4inti,*p1=&i;inti,*p1;p1=&i;3、说明:①、指针变量定义后,若不赋值,其值是不确定的;②、可以给指针变量赋空值(NULL),使指针变量不指向任何变量;ip=NULL;③、指针变量的值为空值(NULL)与未对指针变量赋值,意义不同;④、只能是同类型变量的地址进行赋值;inti,*ip;charch,*cp;ip=&i;cp=&ch;ip=&ch;cp=&i;⑤、可以将数组名赋给某些类型的指针变量;inta[10],*ip;ip=&a[0];ip=a;⑥、不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量;int*ip;ip=3000;4、分析有关指针的程序时,画图是很好的方法:若有:inti,*p;p=&i;i=5;inti,*p;不定i不定pp=&i;&ii=5;510.2.3指针变量的引用inta,*p1,*p2;p1=&a;printf(“%x”,p1);p1?p2=p1;*p1=3;printf(%d,*p1);inta,*p1,*p2;不定a不定p1不定p2p1=&a;&aprintf(%x,p1);p2=p1;&a*p1=3;3printf(%d,*p1);1、两个运算符:&和*&:取地址运算符;*:指针运算符(间接访问符);2、说明:①、&既可作用于一般变量,也可作用于指针变量;②、*只能作用于指针变量;③、表达式中的*p与变量定义中的*p含义不同;inti,*p=&i;*p=5;inta,*p=&a;inta,*p;p=&a;inta,*p;*p=&a;3、指针变量可以进行的操作:inta,*p1,*p2;①、赋值:p1=&a;p2=p1;②、输出:printf(%x,p1);③、取内容:*p1=5;a=5;printf(%d,*p1);④、增减:p1++;p2--;p1+=4;(只能和一个整数)例10.1#includestdio.hmain(){inta1=11,a2=22;int*p1,*p2;p1=&a1;p2=&a2;printf(%d,%d\n,*p1,*p2);p2=p1;printf(%d,%d\n,*p1,*p2);}11a122a2不定p1不定p2&a1&a2*p1*p2&a1*p2*p2多个指针可以指向同一个存储单元。但在某一时刻,一个指针变量只能指向一个存储单元,因为指针变量在某一时刻只能存放一个变量的地址值。例10.2#includestdio.hvoidmain(){inta1=11,a2=22;int*p1,*p2,*p;p1=&a1;p2=&a2;printf(%d,%d\n,*p1,*p2);p=p1;p1=p2;p2=p;printf(%d,%d\n,*p1,*p2);}11a122a2不定p1不定p2不定p&a1&a2*p1*p2&a1&a2*p1*p1&a1*p2*p2使两个指针交换指向例10.3#includestdio.hmain(){inta1=11,a2=22,t;int*p1,*p2;p1=&a1;p2=&a2;printf(%d,%d\n,a1,a2);t=*p1;*p1=*p2;*p2=t;printf(%d,%d\n,a1,a2);}11a122a2不定t不定p1不定p2&a1*p1&a2*p2112211交换两个指针变量所指向变量的值反映了指针变量的引用方法:①、将变量的地址赋给指针变量(p1=&a1)②、将一个指针变量赋给另一个指针变量(p2=p1)③、通过指针变量间接访问它所指向的变量(*p1)4、*和&运算符的进一步说明:①、若有:p1=&a;则*p1等价于a;&*p1&(*p1)&a②、*&a*(&a)*pa③、(*p)++等价于:a++不同于:*p++*p++*(p++)10.2.4指针作为函数参数题目:输入两个整数a、b,按大小顺序输出。#includestdio.hswap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;printf(\nInputa,b:);scanf(%d%d,&a,&b);if(ab)swap(a,b);printf(max=%d,min=%d\n,a,b);}注意:C语言中的函数调用采用“传值”方式,即单向传递方式。即:主调函数可以将实参的值传递给被调函数的形参,但不能通过改变形参的值而改变实参的值。#includestdio.hswap(int*px,int*py){inttemp;temp=*px;*px=*py;*py=temp;}voidmain(){inta,b,*p1,*p2;printf(\nInputa,b:);scanf(%d%d,&a,&b);p1=&a;p2=&b;if(ab)swap(p1,p2);printf(max=%d,min=%d\n,a,b);}5a8b&ap1&bp2不定px不定py&a&b858a5b&ap1&bp2#includestdio.hvoidswap(int*px,int*py){int*temp;*temp=*px;*px=*py;*py=*temp;}voidmain(){inta,b,*p1,*p2;printf(\nInputa,b:);scanf(%d%d,&a,&b);p1=&a;p2=&b;if(ab)swap(p1,p2);printf(max=%d,min=%d\n,a,b);}*temp是指针变量temp所指向的变量,但temp中并无确定的地址值,其值不确定;*temp所指向的单元也不确定。因此,对*temp赋值可能会破坏系统的正常工作状况。应该将*px的值赋给一个整型变量,用整型变量作为临时存储空间实现*px和*py的交换。#includestdio.hvoidswap(int*px,int*py){int*p;p=px;px=py;py=p;}voidmain(){inta,b,*p1,*p2;printf(\nInputa,b:);scanf(%d%d,&a,&b);p1=&a;p2=&b;if(ab)swap(p1,p2);printf(max=%d,min=%d\n,a,b);}5a8b&ap1&bp2不定px不定py&a&b&b&a5a8b&ap1&bp2如果想通过函数调用得到几个要改变的值,可以:①、在主调函数中设n个变量;②、将n变量的地址作为实参传给所调用的函数的形参;③、通过形参指针变量,改变该n个变量的值;④、主调函数就可以使用这些改变了的值;§10.3指针与数组10.3.1指向数组元素的指针变量1、几个概念①、一个变量有地址,称变量的地址为该变量的指针;②、每个数组都有一个起始地址,数组的起始地址称为数组的指针;③、一个数组包含若干元素,每个数组元素都在内存中占用一定的存储单元,即都有相应的地址,数组元素的地址称为数组元素的

1 / 55
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功