如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第6章指针6.1指针与指针变量指针变量的定义一般形式:[存储类型]数据类型*指针名;赋给指针变量,不是赋给目标变量intm=25,*i_p;i_p=&m;floatx=3.2469,*f_p1,*f_p2;f_p1=&x;f_p2=(float*)0x1008;零指针与空类型指针零指针:(空指针)定义:指针变量值为零表示:int*p=0;含义:取变量的地址单目运算符优先级:2结合性:自右向左例i=3;-----直接访问指针变量例main(){inti=10;int*p;*p=i;cout<<*p;}例指针的概念输入a和b两个整数,按先小后大的顺序输出a和b。intmain(){inta,b;int*p1,*p2,*p;cin>>a>>b;p1=&a;p2=&b;if(a>b){p=p1;p1=p2;p2=p;}cout<<a<<b;cout<<*p1<<*p2<<endl;}6.2.3指针作为函数参数voidswap(int*p1,int*p2)//函数的作用是将*p1的值与*p2的值交换{inttemp;temp=*p1;*p1=*p2;*p2=temp;}图6.9请注意交换*p1和*p2的值是如何实现的。如果写成以下这样就有问题了:voidswap(int*p1,int*p2){int*temp;*temp=*p1;//此语句有问题*p1=*p2;*p2=*temp;}本例采取的方法是交换a和b的值,而p1和p2的值不变。这恰和例6.2相反。实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参数也要遵循这一规则。调用函数时不会改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作函数参数,就可以通过指针变量改变主调函数中变量的值,相当于通过函数调用从被调用的函数中得到多个值。如果不用指针变量是难以做到这一点的。例6.4输入a,b,c3个整数,按由大到小的顺序输出。用上面介绍的方法,用3个指针变量指向3个整型变量,然后用swap函数来实现互换3个整型变量的值。程序如下:#include<iostream>usingnamespacestd;intmain(){voidexchange(int*,int*,int*);//对exchange函数的声明inta,b,c,*p1,*p2,*p3;cin>>a>>b>>c;//输入3个整数p1=&a;p2=&b;p3=&c;//指向3个整型变量exchange(p1,p2,p3);//交换p1,p2,p3指向的3个整型变量的值cout<<a<<″″<<b<<″″<<c<<endl;//按由大到小的顺序输出3个整数}voidexchange(int*q1,int*q2,int*q3){voidswap(int*,int*);//对swap函数的声明if(*q1<*q2)swap(q1,q2);//调用swap,将q1与q2所指向的变量的值互换if(*q1<*q3)swap(q1,q3);//调用swap,将q1与q3所指向的变量的值互换if(*q2<*q3)swap(q2,q3);//调用swap,将q2与q3所指向的变量的值互换}voidswap(int*pt1,int*pt2)//将pt1与pt2所指向的变量的值互换{inttemp;temp=*pt1;*pt1=*pt2;*pt2=temp;}运行情况如下:12-5687↙8712-56int型存储单元指针每增加1,就指向该类型(指针类型)的下一个存储单元;每减1,就指向该类型的上一个存储单元。也就是说,指针都是按照它所指向类型的存储单元的字节长度进行增或减。整型变量的内存存储形式。#include<iomanip>intmain(){inti=0x4241;char*p=(char*)&i;cout<<i<<hex<<i<<dec<<*p<<*(p+1)<<endl;}6.3数组与指针(1)a+i和p+i均为数组元素a[i]的指针,即它们均指向元素a[i],因此*(a+i)和*(p+i)均代表a[i]。(2)指向数组元素的指针变量也可以带下标使用,如p[i]与*(p+i)等价。综上所述,对数组元素的引用有两种方法:①下标法,如a[i]或p[i]形式;②指针法,如*(a+i)或*(p+i)形式。(3)指针变量p可以进行自增自减运算,如*p++或*(p++)代表先对指针变量p所指向的数组元素进行引用,然后使指针变量p指向数组的下一个元素。在使用指针