第六章 指针.docx
- 文档编号:7519281
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:38
- 大小:28.51KB
第六章 指针.docx
《第六章 指针.docx》由会员分享,可在线阅读,更多相关《第六章 指针.docx(38页珍藏版)》请在冰豆网上搜索。
第六章指针
第六章指针
6.1指针的概念
内存区的每一个字节有一个编号,这就是“地址”。
&是取地址运算符,&i是变量i的地址。
一个变量的地址称为该变量的指针。
如果一个变量是专门存放另一个变量的地址,则称它为指针变量。
6.2变量与指针
6.2.1定义指针变量
inti,j;
int*pi=&i,*pj;//pi,pj是指向整型数据的指针变量。
double*pd;
pj=&j;
一般的C++编译系统为每一个指针变量分配4个字节的存储单元。
6.2.2引用指针变量
(1)&取地址运算符号
(2)*指针运算符(或称间接引用运算符)
*p为指针变量p所指向的存储单元。
#include
voidmain()
{
intvar=8;
int*pointer;
pointer=&var;
*pointer=5;
cout< cout< <<""<<&var<<""<<&(*pointer)< } 555 0x0064FDF00x0064FDF40x0064FDF00x0064FDF0 例6.1通过指针变量访问整型变量 #include usingnamespacestd; voidmain() { inta,b; int*p1,*p2; a=100;b=10; p1=&a;p2=&b; cout< cout<<*p1<<""<<*p2< } 10010 10010 &*p1,*&a的含义是什么? 例6.2输入a和b两个整数,按先大后小的顺序输出(用指针变量处理) #include usingnamespacestd; voidmain() { int*p1,*p2,*p,a,b; cin>>a>>b; p1=&a;p2=&b; if(a {p=p1;p1=p2;p2=p;} cout<<"a="< cout<<"max="<<*p1<<"min="<<*p2< } 4578 a=45b=78 max=78min=45 调用函数时不会改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。 6.2.3指针作为函数参数 例6.3题目同例6.2 #include usingnamespacestd; voidmain() { voidswap(int*p1,int*p2); int*pointer_1,*pointer_2,a,b; cin>>a>>b; if(a cout<<"max="< } voidswap(int*p1,int*p2) { inttemp; temp=*p1; *p1=*p2; *p2=temp; } 4578 max=78min=45 例6.4输入a,b,c三个整数,按由大到小的顺序输出。 #include usingnamespacestd; voidmain() { voidexchange(int*,int*,int*); inta,b,c,*p1,*p2,*p3; cin>>a>>b>>c; p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); cout< } voidexchange(int*q1,int*q2,int*q3) { voidswap(int*p1,int*p2); if(*q1<*q2)swap(q1,q2);//前两个if选出最大, if(*q1<*q3)swap(q1,q3);//放入q1所指的变量中 if(*q2<*q3)swap(q2,q3); } voidswap(int*p1,int*p2) { inttemp; temp=*p1; *p1=*p2; *p2=temp; } 12-5687 8712-56 6.3指针与数组 6.3.1指向数组元素的指针 在C++中,一个数组类型的操作数被自动转换为指向数组第一个元素的常量指针。 inta[10];int*p; p=&a[0];与语句p=a;等价。 int*q=a;*q=5; 如果p的初值&a[0],则: (1)p+i和a+i就是a[i]的地址。 (2)*(p+i)和*(a+i)就是a[i]。 (3)p[i]和*(p+i)等价。 (下标法和指针法) inta[10]; cout< cout< cout< 能够发现地址值差4 #include voidmain() { inta[10]={2,4,6,8,10}; for(int*p=a;p cout< cout< cout< cout< cout< } 24681000000 108642 ++和*优先级相同,结合规则是自右至左,即自右向左运算,下面是对应的结果: y=*px++;//等价于y=*(px++); y=*++px//等价于y=*(++px); y=++*px//等价于y=++(*px); y=(*px)++; 由于后缀运算的特点,第一个表达式将px指向的变量的值赋给y,然后使px指向下一个变量。 第二个表达式将px指向下一个变量,然后再将px指向的变量的值赋给y。 后两个表达式对px的指向的变量进行增1运算,px未被改变。 #include voidmain() { inta[10]={2,4,6,8,10,12,14,16,18};inty;int*px=a; y=*px++;//等价于y=*(px++); cout< y=*++px;//等价于y=*(++px); cout< //此时px指向a+2*px=6y=6 cout< y=++*px;//等价于y=++(*px); cout< //此时px指向a+2未变,a[2]的值是6+1 cout< y=(*px)++; cout< //此时px指向a+2未变,a[2]的值是6+1+1 cout< } 24 660x0064FDD8 6 770x0064FDD8 7 78 8 (1)*(p++)与*(++p)作用不同。 前者是先取*p值,然后使p加1。 后者是先使p加1,再取*p。 (2)(*p)++表示p所指向的元素值加1。 (3)如果p当前指向a[i],则 *(p--)先对p进行”*”运算,得到a[i],再使p减1,p指向a[i-1]. *(++p)先使p自加1,再作*运算,得到a[i+1]。 *(--p)先使p自减1,再作*运算,得到a[i-1]。 6.3.2用指针变量作函数参数接收数组地址 例6.6将10个整数用选择排序按由小到大的顺序排列。 #include usingnamespacestd; voidmain() {//voidselect_sort(intarray[],intn); voidselect_sort(int*p,intn); inta[10],i; cout<<"entertheoriginalarray: "< for(i=0;i<10;i++)cin>>a[i]; select_sort(a,10); cout<<"thesortedarray: "< for(i=0;i<10;i++)cout< cout< } voidselect_sort(int*p,intn) { inti,j,k,t; for(i=0;i { k=i; for(j=i+1;j if(*(p+j)<*(p+k))k=j; t=*(p+k);*(p+k)=*(p+i);*(p+i)=t; } } /* voidselect_sort(intarray[],intn) { inti,j,k,t; for(i=0;i { k=i; for(j=i+1;j if(array[j] t=array[k];array[k]=array[i];array[i]=t; } } */ entertheoriginalarray: 69-2568711-543077 thesortedarray: -54-2036911567787 例使用函数input输入一组数,然后由main显示出该组数的例子。 #include voidmain() { inta[10]; voidinput(int*s,intn); input(a,10); for(inti=0;i<10;i++) cout< cout< } voidinput(int*s,intn) { cout<<"Pleaseenter"< for(inti=0;i cin>>s[i]; } Pleaseenter10integers 12345678910 12345678910 #include voidfun(int*a,int*b) { intk; cout<<*a<<""<<*b< k=*a;*a=*b;*b=k; } voidmain() { inta=3,b=6,*x=&a,*y=&b; cout< fun(x,y); cout< } 36 36 63 6.3.3多维数组与指针 1.多维数组元素的地址 inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; a是一个数组名。 a数组包含3行,即三个元素: a[0],a[1],a[2]。 而每一元素又是一维数组,它包含4个元素。 #include usingnamespacestd; voidmain() { inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; cout< cout< cout< cout<<*(a[1]+1)<<""<<*(*(a+1)+1)<<""< } 0068FDC80068FDC8 0068FDD80068FDD8 0068FDE80068FDE8 111111 2.指向多维数组元素的指针变量 (1)指向数组元素的指针变量 例6.7输出二维数组各元素的值 #include usingnamespacestd; voidmain() { inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; int*p; //for(p=a[0];p<*a+12;p++) for(p=a[0];p cout<<*p<<''; cout< } 1357911131517192123 (2)指向由m个元素组成的一维数组的指针(指向数组的指针) #include voidmain() { intn[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}; int(*a)[5]=n; for(inti=0;i<5;i++) cout<<(*a)[i]<<""; cout< for(i=0;i<5;i++) cout<<(*(a+1))[i]<<""; cout< for(i=0;i<5;i++) cout<<(*(a+2))[i]<<""; cout< } 12345 678910 1112131415 #include voidmain() { intn[3][5]={{1,2,3,4,5},{6,7,8,9,10}}; int(*a)[5]=n; int*p; cout<<*a<<""< p=*a; a+=1;//使a指向下一个int[5]这两句可用p=*a++;代替。 cout<<*a<<""< 0x0064FDC40x0064FDB0 for(inti=0;i<5;i++) cout<<*p++<<"";//12345 cout< p=*a; cout<<*a<<""< for(i=0;i<5;i++) cout<<*p++<<"";//678910 cout< cout<<**a< } 0x0064FDB00x0064FDB0 0x0064FDC40x0064FDB0 12345 0x0064FDC40x0064FDC4 678910 6 #include usingnamespacestd; voidmain() { inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; int(*p)[4],i;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章 指针 第六