《C++指针的运用ppt课件》由会员分享,可在线阅读,更多相关《C++指针的运用ppt课件(51页珍藏版)》请在金锄头文库上搜索。
1、2020/8/14,.,1,第5章指针的应用,5.1、指针概述 一、内存地址的概念 地址编码的基本单位是字节,每个字节是一个基本内存单元。 二、从内存单元中存取数据的 方法 1、通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。,2020/8/14,.,2,2、通过地址,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。 C+拥有在运行时获得变量的地址和操纵地
2、址的能力。变量的地址可以使用地址运算符 void main( ) int a;int *p; a=10;p= ,2020/8/14,.,5,5.2、指针变量的定义、赋值及使用 一、指针变量的定义 指针本身也是一种变量,须先声明后使用。 声明指针类型的变量是在声明变量的同时加上*来完成的。对应于各种类型的数据都有相应的指针类型。 *放在指针定义中时,被称为指针定义符。 放在可执行语句中的指针前被称为指针运算符,也称为“间接访问”运算符。,2020/8/14,.,6,指针变量的声明语句,由数据类型后跟星号,再跟随指针变量名组成。 数据类型 *指针变量名; 如:int* iptr;int *iptr
3、; int * iptr;int*iptr; 在指针定义中,一个*只能表示一个指针。 int * iptr1,iptr2; /iptr1指针变量,iptr2整型变量 int * iptr1, * iptr2;/两个指针变量,2020/8/14,.,7,地址和指针的关系 int x,*ptr ; x=3; ptr=/x=11 ,2020/8/14,.,8,二、指针变量的赋值 与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为0、NULL或一个地址。数值为0或者NULL的指针不指任何内容。数值0是可以直接赋给指针变量的唯一整数值。 1.在定义指针变量的同时进行初始化赋值,一
4、般格式如下: 数据类型 *指针名初始地址;,2020/8/14,.,9,2.定义指针变量后,用赋值语句将其初始化。 指针变量名=地址; 可以是变量的地址、数组名、函数名等。 用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。 不能把常量或表达式的地址赋给指针变量。 不能将一个非0整数直接赋给指针变量,但可以赋整数值0,表示该指针为空指针。 例如:int *p; p=0; p为空指针,不指向任何地址。,2020/8/14,.,10,3.允许声明指向 void 类型的指针,该指针可以被赋予任何类型对象的地址。 例如: void *general; int *point; int i; g
5、eneral=,2020/8/14,.,11,例5.2、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int x; int *p;int *q; int a=3; int *pa= ,2020/8/14,.,12,#include using namespace std; void main() int x=3,*ptr=/变量x的地址 ,2020/8/14,.,13,三、指针变量的使用 例5.3、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int x,
6、*p; p= ,2020/8/14,.,14,指针在使用前要进行初始化或赋值,指针未赋值将非常危险。 #include using namespace std; void main() int x=26;int *ptr; *ptr=58;/此时ptr是一个随机地址 coutxendl; 很可能已经破坏了另一变量的值,甚至修改了函数的返回地址等。,2020/8/14,.,15,5.3、简单变量与指针 指针的类型是它所指向变量的类型。指针值不是整型数,在使用中必须类型匹配。如: int x=26; int *ptr= 表示将变量x的地址值作为一个整型数赋给变量*ptr,即变量x。,2020/8/
7、14,.,16,因为指针是有类型的,所以给指针赋值不但要是一个地址,而且应该是一个与该指针类型相符的变量的地址。或者说指针的类型是它所指向变量的类型。 float f=34.5,*fptr=/error:浮点指针赋给整型指针 将一个指针赋值给另一个指针,结果是两个指针指向一个相 同的地址单元。,2020/8/14,.,17,例5.4、阅读如下程序: 源程序清单: #include using namespace std; void main( ) int x,*p; x=3; p= ,2020/8/14,.,18,例5.5、输入a和b两个整数,运用指针技术按先大后小的顺序输出a和b。 源程序清
8、单: #include #include using namespace std; void main(void) /利用间接访问方式来操作,2020/8/14,.,19,int a,b; int *p1= ,2020/8/14,.,20,指针变量的运算 指针的算术运算 指针加一,减一运算 是指向下一个或前一个数据。 如:y=*px+ 相当于y=*(px+) /px为一指针 指针与整数的加减运算 指针 p 加上或减去 n ,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。 这种运算的结果值取决于指针指向的数据类型。,2020/8/14,.,21,2020/8/14,.,22,pb-1
9、,pb,pb+1,pb+2,*(pb-1),*pb,*(pb+1),*(pb+2),int *pb,2020/8/14,.,23,#include using namespace std; void main() int n=20,*ptr= ,2020/8/14,.,24,关系运算 表示所指变量在内存中的位置关系 如:两个指针变量指向同一个数组中的元素时,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系 char a10; char *p1,*p2; p1=a+2; p2=a+4; p1+;p2-; 指针可以和零之间进行等于或不等于的关系运算。 例如:p=0;/表示空指针,20
10、20/8/14,.,25,例5.5、编写一交换两个整型变量值的函数,并写一主函数测试。 #include 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/8/14,.,26,5.4、一维数组与指针 数组名可以拿来初始化指针,数组名就是数组第一个元素的地址,即对于数组a,有a= 对第i个元素可表示成以下四种: ai 、*(a+i) 、iptri 、*(iptr+i) 这四个等价关系使得数组与指针
11、相互转换非常灵活。,2020/8/14,.,27,与上面相对应的有下面四个地址等价关系: int sum1,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/8/14,.,29,iPtr=i
12、Array;/方法2 for(n=0;nsize;n+) sum2+=*iPtr+; iPtr=iArray; /方法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/8/14,.,30,例5.7、阅读如下程序: 源程序清单: #include using n
13、amespace std; void main( ) char a10=abcdefghi; char *p1,*p2; p1=a; p1+=2;,2020/8/14,.,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没有指向数组中的同一个元素!en
14、dl; ,2020/8/14,.,32,例5.8、利用指针技术,将键盘输入的N个整数按相反的顺序存放并输出。 思路分析: 分别取出数组最前面和最后面的元素,进行交换,即a0与aN-1交换;然后再分别取出a1与aN-2交换;直到交换完毕。,2020/8/14,.,33,源程序清单: #include #include using namespace std; int main(void) int a10,i,j,temp,*p; cout*p; p=a;,2020/8/14,.,34,for(i=0,j=10-1;ij;i+,j-) temp=*(p+i); *(p+i)=*(p+j); *(p
15、+j)=temp; for(p=a;pa+10;p+) coutsetw(4)*p; coutendl; return 0; ,2020/8/14,.,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/8/14,.,36,cout*t; coutx; t=a;p=0; while (x*(t+p) ,
16、2020/8/14,.,37,例5.10、从键盘输入整数集合a、b的元素个数和各个元素的值(不相同),计算并输出其交集。 #include 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/8/14,.,38,coutd; cout*pa; coute; cout*pb;,2020/8/14,.,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(