(精品)C++课件第五章.ppt
2023/4/101第5章 指针的应用5.1、指针概述指针概述一、内存地址的概念一、内存地址的概念地址编码的基本单位是字节,每个字节是一地址编码的基本单位是字节,每个字节是一个基本内存单元。个基本内存单元。二、二、从内存单元中存取数据的从内存单元中存取数据的 方法方法1 1、通过变量名,称为直接访问方式,直接对、通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。量名存取变量内容。2023/4/1022 2、通过地址,称为间接访问方式,先找到存、通过地址,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取变量的地址找到变量的存储单元,对它进行存取访问。访问。C+C+拥有在运行时获得变量的地址和操纵地址拥有在运行时获得变量的地址和操纵地址的能力。变量的地址可以使用地址运算符的能力。变量的地址可以使用地址运算符&求得,求得,在某一变量前加上地址运算符在某一变量前加上地址运算符&,则为该变量的,则为该变量的地址,如:地址,如:&x&x表示变量表示变量x x的地址的地址数组名表示数组的首地址;函数的地址用函数组名表示数组的首地址;函数的地址用函数名表示。数名表示。用来存放地址的变量就叫做指针型变量,简用来存放地址的变量就叫做指针型变量,简称指针。称指针。2023/4/103假设假设ptrptr为一指针,则语句:为一指针,则语句:ptrptr=&x;=&x;就将变量就将变量x x的地址存入了指针的地址存入了指针ptrptr中。中。也经常简称为也经常简称为“指针指针ptrptr指向变量指向变量x x”。可以通过指针得到变量可以通过指针得到变量x x的值或改变变量的值或改变变量x x的值:的值:*ptrptr=2;=2;/相当于相当于 x=2x=2y=*y=*ptrptr;/将将x x的值赋给的值赋给y y2023/4/104例例5.15.1、阅读如下程序:阅读如下程序:源程序清单:源程序清单:#include#include using namespace std;using namespace std;void main()void main()intint a;a;intint*p;*p;a=10;a=10;p=&a;p=&a;coutcoutaa的值表示方法的值表示方法1 1:aaendlendl;coutcoutaa的值表示方法的值表示方法2 2:*p*pendlendl;coutcoutaa的地址表示方法的地址表示方法1 1:&a&aendlendl;coutcoutaa的地址表示方法的地址表示方法2 2:ppendlendl;2023/4/1055.2、指针变量的定义、赋值及使用指针变量的定义、赋值及使用一、一、指针变量的定义指针变量的定义指针本身也是一种变量,须先声明后使用。指针本身也是一种变量,须先声明后使用。声明指针类型的变量是在声明变量的同时加声明指针类型的变量是在声明变量的同时加上上*来完成的。对应于各种类型的数据都有相应来完成的。对应于各种类型的数据都有相应的指针类型。的指针类型。*放在指针定义中时,被称为放在指针定义中时,被称为指针定义符指针定义符。放在可执行语句中的指针前被称为放在可执行语句中的指针前被称为指针运算指针运算符符,也称为,也称为“间接访问间接访问”运算符。运算符。2023/4/106指针变量的声明语句,由数据类型后跟星号,指针变量的声明语句,由数据类型后跟星号,再跟随指针变量名组成。再跟随指针变量名组成。数据类型数据类型 *指针变量名;指针变量名;如如:intint*iptriptr;intint *iptriptr;intint*iptriptr;intint*iptriptr;在指针定义中,一个在指针定义中,一个*只能表示一个指针。只能表示一个指针。intint*iptr1,iptr2;*iptr1,iptr2;/iptr1/iptr1指针变量,指针变量,iptr2iptr2整型变量整型变量intint*iptr1,*iptr2;*iptr1,*iptr2;/两个指针变量两个指针变量2023/4/107地址和指针的关系地址和指针的关系intint x x,*ptrptr;x=3x=3;ptrptr=&x;=&x;如果如果ptrptr指向指向x x,那么,那么*ptrptr 的值为的值为x x的值,以的值,以后对后对*ptrptr的赋值等价于对的赋值等价于对x x的赋值。的赋值。#include#include using namespace std;using namespace std;void main()void main()intint x=3,*x=3,*ptrptr;ptrptr=&x;=&x;*ptrptr=11;=11;coutcoutxxendlendl;/x=11/x=11 2023/4/108二、二、指针变量的赋值指针变量的赋值与变量定义一样,定义好指针变量后也可以与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为对它进行初始化,指针变量可以初始化为0、NULL或一个地址。数值为或一个地址。数值为0或者或者NULL的指针不的指针不指任何内容。数值指任何内容。数值0是可以直接赋给指针变量的是可以直接赋给指针变量的唯一整数值。唯一整数值。1.1.在定义指针变量的同时进行初始化赋值,一般在定义指针变量的同时进行初始化赋值,一般格式如下:格式如下:数据类型数据类型 *指针名初始地址;指针名初始地址;2023/4/1092.2.定义指针变量后,用赋值语句将其初始化。定义指针变量后,用赋值语句将其初始化。指针变量名指针变量名=地址;地址;可以是变量的地址、数组名、函数名等。可以是变量的地址、数组名、函数名等。用变量地址作为初值时,该变量的定义必须用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。在指针初始化之前定义。不能把常量或表达式的地址赋给指针变量。不能把常量或表达式的地址赋给指针变量。不能将一个非不能将一个非0 0整数直接赋给指针变量,但可整数直接赋给指针变量,但可以赋整数值以赋整数值0 0,表示该指针为空指针。,表示该指针为空指针。例如:例如:intint*p;p=0;*p;p=0;p p为空指针,不指向任何地址。为空指针,不指向任何地址。2023/4/10103.3.允许声明指向允许声明指向 void void 类型的指针,该指针可以类型的指针,该指针可以被赋予任何类型对象的地址。被赋予任何类型对象的地址。例如:例如:void*general;void*general;intint*point;*point;intint i;i;general=&i;general=&i;point=(point=(intint*)general;*)general;2023/4/1011例例5.25.2、阅读如下程序:、阅读如下程序:源程序清单:源程序清单:#include#include using namespace std;using namespace std;void main()void main()intint x;x;intint*p;*p;intint*q;*q;intint a=3;a=3;intint*pa=&a;*pa=&a;p=&x;p=&x;q=p;q=p;coutcout*pa*paendlendl;2023/4/1012#include#include using namespace std;using namespace std;void main()void main()intint x=3,*x=3,*ptrptr=&x;=&x;*ptrptr=52;=52;coutcoutxxendlendl;/52/52coutcout*ptrptrendl;/52endl;/52coutcoutptrptrendlendl;/变量变量x x的地址的地址coutcout&x&xendlendl;/变量变量x x的地址的地址 2023/4/1013三、三、指针变量的使用指针变量的使用例例5.35.3、阅读如下程序:、阅读如下程序:源程序清单:源程序清单:#include#include using namespace std;using namespace std;void main()void main()intint x,*p;x,*p;p=&x;p=&x;cincin*p;*p;coutcout*p*pendlendl;2023/4/1014指针在使用前要进行初始化或赋值,指针未指针在使用前要进行初始化或赋值,指针未赋值将非常危险。赋值将非常危险。#include#include using namespace std;using namespace std;void main()void main()intint x=26 x=26;intint*ptrptr;*ptrptr=58;=58;/此时此时ptrptr是一个随机地址是一个随机地址coutcoutxxendlendl;很可能已经破坏了另一变量的值,甚至修改很可能已经破坏了另一变量的值,甚至修改了函数的返回地址等。了函数的返回地址等。2023/4/10155.3、简单变量与指针、简单变量与指针指针的类型是它所指向变量的类型。指针值不是指针的类型是它所指向变量的类型。指针值不是整型数,在使用中必须类型匹配。如:整型数,在使用中必须类型匹配。如:intint x=26 x=26;intint*ptrptr=&x;=&x;/定义指针变量定义指针变量*ptrptr=&x;=&x;/error:/error:不能将整型地址转换成整型数不能将整型地址转换成整型数*ptrptr=50;=50;/执行语句:执行语句:*在此处作间接引用在此处作间接引用可以对不同的类型作强制转换,如:可以对不同的类型作强制转换,如:*ptrptr=(=(int)&xint)&x;表示将变量表示将变量x x的地址值作为一个整型数赋给变的地址值作为一个整型数赋给变量量*ptrptr,即变量,即变量x x。2023/4/1016因为指针是有类型的,所以给指针赋值不但因为指针是有类型的,所以给指针赋值不但要是一个地址,而且应该是一个与该指针类型相要是一个地址,而且应该是一个与该指针类型相符的变量的地址。或者说指针的类型是它所指向符的变量的地址。或者说指针的类型是它所指向变量的类型。变量的类型。float f=34.5,float f=34.5,*fptrfptr=&f;=&f;/浮点指针浮点指针intint*iptriptr=&f;=&f;/error:/error:浮点变量地址赋给整浮点变量地址赋给整型指针型指针iptriptr=fptrfptr;/error:/error:浮点指针赋给整型指针浮点指针赋给整型指针将一个指针赋值给另一个指针,结果是两个将一个指针赋值给另一个指针,结果是两个指针指向一个相指针指向一个相 同的地址单元。同的地址单元。2023/4/1017例例5.45.4、阅读如下程序:、阅读如下程序:源程序清单:源程序清单:#include#include using namespace std;using namespace std;void main()void main()intint x,*p;x,*p;x=3;x=3;p=&x;p=&x;*p=*p+10;*p=*p+10;coutcout*p*pendlendl;2023/4/1018例例5.55.5、输入、输入a a和和b b两个整数,运用指针技术按先两个整数,运用指针技术按先大后小的顺序输出大后小的顺序输出a a和和b b。源程序清单:源程序清单:#include#include#include#include using namespace std;using namespace std;void void main(voidmain(void)/利用间接访问方式来操作利用间接访问方式来操作 2023/4/1019intint a,ba,b;intint*p1=&a;*p1=&a;intint*p2=&b;*p2=&b;coutcoutinput a and b:input a and b:*p1*p2;*p1*p2;if(*p1*p2)if(*p1*p2)coutcout按按先先大大后后小小的的顺顺序序输输出出的的a a和和b b为为:*p2setw(4)*p1:*p2setw(4)*p1endlendl;else else coutcout按按先先大大后后小小的的顺顺序序输输出出的的a a和和b b为为:*p1setw(4)*p2:*p1setw(4)*p2endlendl;2023/4/1020指针变量的运算指针变量的运算指针的算术运算指针的算术运算指针加一,减一运算指针加一,减一运算是指向下一个或前一个数据。是指向下一个或前一个数据。如:如:y=*y=*pxpx+相当于相当于y=*(y=*(pxpx+)/+)/pxpx为一指针为一指针指针与整数的加减运算指针与整数的加减运算指针指针 p p 加上或减去加上或减去 n n,其意义是指针当前指,其意义是指针当前指向位置的前方或后方第向位置的前方或后方第 n n 个数据的地址。个数据的地址。这种运算的结果值取决于指针指向的数据类型。这种运算的结果值取决于指针指向的数据类型。2023/4/1021pa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa2023/4/1022pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)int *pb2023/4/1023#include#include using namespace std;using namespace std;void main()void main()intint n=20,*n=20,*ptrptr=&n,*ptr1,y;=&n,*ptr1,y;y=*y=*ptrptr;coutcoutptrptr=ptrptrty=yty=yendlendl;y=*(y=*(ptrptr+);+);/y=*(+/y=*(+ptrptr););coutcoutptrptr=ptrptrty=yty=yendlendl;ptr1=ptr+3;ptr1=ptr+3;y=*ptr1;y=*ptr1;coutcoutptrptr=ptr1ty=y=ptr1ty=yendlendl;2023/4/1024关系运算关系运算表示所指变量在内存中的位置关系表示所指变量在内存中的位置关系如:两个指针变量指向同一个数组中的元素如:两个指针变量指向同一个数组中的元素时,其关系运算的结果表明了这两个指针变量所时,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系指向的数组元素的先后关系char a10;char*p1,*p2;p1=a+2;p2=a+4;p1+;p2-;指针可以和零之间进行等于或不等于的关系运算。指针可以和零之间进行等于或不等于的关系运算。例如:例如:p=0;p=0;/表示空指针表示空指针 2023/4/1025例例5.55.5、编写一交换两个整型变量值的函数,并、编写一交换两个整型变量值的函数,并写一主函数测试。写一主函数测试。#include#include using namespace std;using namespace std;void void swap(intswap(int*x,intx,int*y)*y)intint t;t;t=*x,*x=*y,*y=t;t=*x,*x=*y,*y=t;void main()void main()intint a=1,b=2;a=1,b=2;coutcout交换前交换前:a=a,b=b:a=a,b=bendlendl;swap(&a,&bswap(&a,&b););coutcout交换后交换后:a=a,b=b:a=a,b=bendlendl;2023/4/10265.4、一维数组与指针、一维数组与指针数组名可以拿来初始化指针,数组名就是数数组名可以拿来初始化指针,数组名就是数组第一个元素的地址,即对于数组组第一个元素的地址,即对于数组a a,有,有a=&a0a=&a0。假设按下面定义数组假设按下面定义数组a a及指针及指针iptriptr:intint a10,*a10,*iptriptr=a;=a;对第对第i i个元素可表示成以下四种:个元素可表示成以下四种:aiai 、*(a+ia+i)、iptriiptri 、*(iptr+iiptr+i)这四个等价关系使得数组与指针相互转换非常灵这四个等价关系使得数组与指针相互转换非常灵活。活。2023/4/1027与上面相对应的有下面四个地址等价关系:与上面相对应的有下面四个地址等价关系:&aiai a+ia+i iptr+iiptr+i&iptriiptri a+ia+i表示第表示第i i个数组元素的地址,个数组元素的地址,iptr+iiptr+i也同也同样是指向数组样是指向数组a a的第的第i i个数组元素。个数组元素。相互等价相互等价2023/4/1028例例5.65.6、求数组元素的和、求数组元素的和#include#include using namespace std;using namespace std;intint sum1,sum2,sum3,sum4,sum5,*sum1,sum2,sum3,sum4,sum5,*iPtriPtr;intint iArrayiArray=1,4,2,7,13,32,21,48,16,30;=1,4,2,7,13,32,21,48,16,30;void main()void main()intint size,nsize,n;size=size=sizeof(iArray)/sizeofsizeof(iArray)/sizeof(*(*iArrayiArray););/sizeof(iArraysizeof(iArray):数组:数组iArrayiArray所占字节数所占字节数/sizeofsizeof(*(*iArrayiArray):数组元素类型所占字节数:数组元素类型所占字节数 for(nfor(n=0;n=0;nsize;nsize;n+)sum1+=+)sum1+=iArrayniArrayn;/方法方法1 12023/4/1029iPtriPtr=iArrayiArray;/方法方法2 2for(nfor(n=0;n=0;nsize;nsize;n+)sum2+=*+)sum2+=*iPtriPtr+;+;iPtriPtr=iArrayiArray;/方法方法3 3for(nfor(n=0;n=0;nsize;nsize;n+)sum3+=*(+)sum3+=*(iPtr+niPtr+n););iPtriPtr=iArrayiArray;/方法方法4 4for(nfor(n=0;n=0;nsize;nsize;n+)sum4+=+)sum4+=iPtrniPtrn;/方法方法5 5for(nfor(n=0;n=0;nsize;nsize;n+)sum5+=*(+)sum5+=*(iArray+niArray+n););coutcoutsum1=sum1,sum2=sum2sum1=sum1,sum2=sum2,sum3=sum3,sum4=sum4,sum3=sum3,sum4=sum4,sum5=sum5,sum5=sum5endlendl;2023/4/1030例例5.75.7、阅读如下程序:、阅读如下程序:源程序清单:源程序清单:#include#include using namespace std;using namespace std;void main()void main()char a10=char a10=abcdefghiabcdefghi;char*p1,*p2;char*p1,*p2;p1=a;p1=a;p1+=2;p1+=2;2023/4/1031 p2=a+4;p2=a+4;/指指针针变变量量p2p2,直直接接由由数数组组名名加加上上4 4,指向数组的第五个数组元素的内存单元,指向数组的第五个数组元素的内存单元 if(p1p2)coutp1if(p1p2)coutp1所所指指向向的的数数组组元元素素在在p2p2所所指指向的数组元素前面!向的数组元素前面!endlendl;else else coutcoutp1p1所所指指向向的的数数组组元元素素在在p2p2所所指指向向的的数组元素后面!数组元素后面!endlendl;p1+;p1+;p2-;p2-;if(p1=p2)coutp1if(p1=p2)coutp1和和p2p2同同时时指指向向数数组组中中的的同同一个元素且元素值为:一个元素且元素值为:*p1*p1endlendl;else else coutcoutp1p1和和p2p2没没有有指指向向数数组组中中的的同同一一个个元元素!素!endlendl;2023/4/1032例例5.85.8、利用指针技术,将键盘输入的、利用指针技术,将键盘输入的N个整数个整数按相反的顺序存放并输出。按相反的顺序存放并输出。思路分析:思路分析:分别取出数组最前面和最后面的元素,进行分别取出数组最前面和最后面的元素,进行交换,即交换,即a0与与aN-1交换;然后再分别取出交换;然后再分别取出a1与与aN-2交换;直到交换完毕。交换;直到交换完毕。2023/4/1033源程序清单:源程序清单:#include#include#include#include using namespace std;using namespace std;intint main(voidmain(void)intint a10,i,j,temp,*p;a10,i,j,temp,*p;coutcoutInput ten Input ten intergerinterger:endlendl;for(pfor(p=a;pa;pa+10;p+)*p;*p;p=a;p=a;2023/4/1034 for(ifor(i=0,j=10-1;i=0,j=10-1;ij;i+,jj;i+,j-)-)temp=*(temp=*(p+ip+i););*(*(p+ip+i)=*()=*(p+jp+j););*(*(p+jp+j)=temp;)=temp;for(pfor(p=a;pa;pa+10;p+)a+10;p+)coutcoutsetw(4)*p;setw(4)*p;coutcoutendlendl;return 0;return 0;2023/4/1035例例5.95.9、把一个整数插入到一个由小到大的有序、把一个整数插入到一个由小到大的有序整数序列中,并仍然保持由小到大的顺序。整数序列中,并仍然保持由小到大的顺序。设有设有1010个整数按由小到大的顺序存放在数组个整数按由小到大的顺序存放在数组a a中,待插入的数放在变量中,待插入的数放在变量x x中。中。#include#include#include#include using namespace std;using namespace std;void void main(voidmain(void)const const intint N=10;N=10;intint aN+1,p,x,*t;aN+1,p,x,*t;2023/4/1036coutcout输入输入a a数组:数组:endlendl;for(tfor(t=a;ta;t*t;*t;coutcout输入待插入的数输入待插入的数x x:x;x;t=t=a;pa;p=0;=0;while(x*(while(x*(t+p)&pt+p)&pN)=for(t=a+N-1;t=a+p;ta+p;t-)-)*(t+1)=*t;*(t+1)=*t;t=t=a+pa+p;*t=x;*t=x;for(t=for(t=a;ta;t=a+N;ta+N;t+)+)coutcoutsetw(3)*t;setw(3)*t;coutcoutendlendl;2023/4/1037例例5.105.10、从键盘输入整数集合、从键盘输入整数集合a a、b b的元素个数和的元素个数和各个元素的值(不相同),计算并输出其交集。各个元素的值(不相同),计算并输出其交集。#include#include using namespace std;using namespace std;#include#include void void main(voidmain(void)const const intint M=20,N=10;M=20,N=10;intint aM,bN,cMaM,bN,cM;intint d,e,fd,e,f=0,*pa,*=0,*pa,*pbpb,*pc;,*pc;2023/4/1038coutcout输入数组输入数组a a中元素的个数:中元素的个数:d;d;coutcout输入数组输入数组a a的的dd个元素:个元素:endlendl;for(pafor(pa=a;paa;pa*pa;*pa;coutcout输入数组输入数组b b中元素的个数:中元素的个数:e;e;coutcout输入数组输入数组b b的的ee个元素:个元素:endlendl;for(pbfor(pb=b;pbb;pb*pbpb;2023/4/1039for(pafor(pa=a,pca,pc=c;pac;pa a+d;paa+d;pa+)+)for(pbfor(pb=b;pbb;pb b+e;pbb+e;pb+)+)if(*pa=*if(*pa=*pbpb)*pc+=*pa;*pc+=*pa;f+;f+;break;break;coutcout交集交集c c的各个元素依次为的各个元素依次为:endlendl;for(pcfor(pc=c;pcc;pc c+f;pcc+f;pc+)+)coutcoutsetw(3)*pc;setw(3)*pc;coutcoutendlendl;2023/4/1040例例5.115.11、从键盘输入整数集合、从键盘输入整数集合a a、b b的元素个数和的元素个数和各个元素的值(不相同)各个元素的值(不相同),计算并输出其并集。,计算并输出其并集。#include#include using namespace std;using namespace std;#include#include void void main(voidmain(void)const const intint M=20,N=10;M=20,N=10;intint aM,bN,cM+NaM,bN,cM+N;intint d,e,fd,e,f=0,*pa,*=0,*pa,*pbpb,*pc;,*pc;2023/4/1041coutcout输入数组输入数组a a中元素的个数:中元素的个数:d;d;coutcout输入数组输入数组a a的的dd个元素:个元素:endlendl;for(pafor(pa=a;paa;pa*pa;*pa;coutcout输入数组输入数组b b中元素的个数:中元素的个数:e;e;coutcout输入数组输入数组b b的的ee个元素:个元素:endlendl;for(pbfor(pb=b;pbb;pb*pbpb;2023/4/1042for(pafor(pa=a,pca,pc=c;pac;pa a+d;pa+,pca+d;pa+,pc+)+)*pc=*pa;f+;*pc=*pa;f+;for(pbfor(pb=b;pbb;pb b+e;pbb+e;pb+)+)for(pafor(pa=a;paa;pa=a+da+d)*pc+=*pc+=*pbpb;f+;f+;coutcout“并集并集c c的各个元素依次为的各个元素依次为:endlendl;for(pc=for(pc=c;pcc;pc c+f;pcc+f;pc+)+)coutcoutsetw(3)*pc;setw(3)*pc;coutcoutendlendl;2023/4/1043例例5.125.12、编程实现将一个数组中的数据按相反顺、编程实现将一个数组中的数据按相反顺序存放。序存放。思思路路分分析析:用用一一个个子子函函数数实实现现按按相相反反顺顺序序存存放放,主主函数调用该子函数实现按相反顺序存放。函数调用该子函数实现按相反顺序存放。#include#include using namespace std;using namespace std;void void invert(intinvert(int*p,intp,int n)n)intint i,j,tempi,j,temp;for(ifor(i=0,j=n-1;i=0,j=n-1;ij;i+,jj;i+,j-)-)temp=*(temp=*(p+ip+i););*(*(p+ip+i)=*()=*(p+jp+j););*(*(p+jp+j)=temp;)=temp;2023/4/1044intint main(voidmain(void)intint a10,i;a10,i;coutcoutInput ten Input ten intergerinterger:endlendl;for(ifor(i=0;i10;i+)=0;iaiai;invert(a,10);invert(a,10);for(ifor(i=0;i10;i+)=0;i10;i+)coutcoutaiaiendlendl;return 0;return 0;2023/4/10455.5、二维数组与指针、二维数组与指针例例5.135.13、利用指针技术,输出如下二维数组各元、利用指针技术,输出如下二维数组各元素的值。素的值。inta34=inta34=1,2,3,4,5,6,7,8,9,10,11,121,2,3,4,5,6,7,8,9,10,11,12源程序清单源程序清单1 1:#include#include#include#include using namespace std;using namespace std;void void main(voidmain(void)2023/4/1046 intint a34=1,2,3,4,5,6,7,8,9,10,11,12;a34=1,2,3,4,5,6,7,8,9,10,11,12;intint*p;*p;for(pfor(p=a0;pa0+12;p+)=a0;pa0+12;p+)if(p-a0)%4=0)coutif(p-a0)%4=0)coutendlendl;coutcoutsetw(4)*p;setw(4)*p;coutcoutendlendl;2023/4/1047源程序清单源程序清单2 2:#include#include#include#include using namespace std;using namespace std;void void main(voidmain(void)intint a34=1,2,3,4,5,6,7,8,9,10,11,12;a34=1,2,3,4,5,6,7,8,9,10,11,12;intint*p3;*p3;intint i,ji,j;2023/4/1048for(ifor(i=0;i3;i+)=0;i3;i+)pipi=aiai;for(jfor(j=0;j4;j+)=0;j4;j+)coutcoutsetw(4)*(setw(4)*(pi+jpi+j););coutcoutendlendl;2023/4/1049例例5.145.14、利用指针技术,求、利用指针技术,求55方阵主对角线的方阵主对角线的和。和。思路分析:思路分析:55的方阵用二维数组的方阵用二维数组a55表示,表示,定义一个指针数组定义一个指针数组*p5,来操作数组;求主对,来操作数组;求主对角线的和,先找到主对角线上的元素,应满足条角线的和,先找到主对角线上的元素,应满足条件行号等于列号,再进行累加。件行号等于列号,再进行累加。源程序清单:源程序清单:#include#include using namespace std;using namespace std;void void main(voidmain(void)2023/4/1050 intint a55;a55;intint*p5;*p5;intint i,j,sumi,j,sum=0;=0;coutcout请输入方阵的值:请输入方阵的值:endlendl;for(ifor(i=0;i5;i+)=0;i5;i+)pipi=aiai;for(jfor(j=0;j5;j+)=0;j*(*(pi+jpi+j););2023/4/1051for(ifor(i=0;i5;i+)=0;i5;i+)pipi=aiai;for(jfor(j=0;j5;j+)=0;j5;j+)if(iif(i=j)sumj)sum=sum+*(=sum+*(pi+jpi+j););coutcout方阵的对角线之和为方阵的对角线之和为:sum:sumendlendl;