




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章指针8.1指针变量8.2数组指针变量8.3指针数组和二级指针变量8.1.1变量的指针和指针变量内存地址变量的地址inta=5,b=10;201220103000变量a变量b510变量p2010一个存储单元首字节的编号称为该存储单元的“地址”,也就是相应变量的地址在一个地址所标记的存储单元中存放的数据称为该存储单元的“内容”。
直接访问间接访问
8.1.1变量的指针和指针变量201220103000变量a变量b510变量p2010指针、变量的指针和指针变量指针就是“内存单元的地址”变量的指针就是“变量的地址”,它指向一个变量对应的内存单元。保存指针(地址)数据的变量称为指针变量。间接访问
8.1.2指针变量的定义和初始化定义指针变量的一般形式为:类型标识符*指针变量名;如:
int*ip;char*cp;
指针变量也可进行初始化。例如:inta;
int*p=&a;&aap8.1.3指针变量的引用指针变量同普通变量一样,使用之前不仅要定义,而且必须赋予具体的值。两个有关的运算符:取地址运算符“&”:形式为:&变量名功能:得到变量的地址,为一指针。只能作用于变量。例如:&x,&a[5]…
等是正确的应用
&25,&(k+1)…
等是错误的应用指针运算符(或称“间接访问”运算符)。一般形式为:*指针变量名如:*ip表示指针变量ip所指向的变量。【例8.1】指针运算符的示例。main(){
inta=3,b=6,*pa=&a,*pb=&b;
printf("a=%2d,b=%2d\n",a,b);
printf("*pa=%2d,*pb=%2d",*pa,*pb);}inta=3,b=6;int*pa=&a,*pb=&b;说明:“&”和“*”均为单目运算符,优先级别相同,且都具有右结合性.&*pa与&a是等价的。*&a与a是等价的。2.对指针变量的赋值操作可以通过赋值语句将一个有效的内存地址赋给已定义的指针变量
inta,*pa;pa=&a;*pa=3;说明:指向相同类型的指针变量之间可以相互赋值。inta=3,*pa=&a,*pb;
pb=pa;*pb+=1;int*p;p=NULL;或:p=0; a+=1;a=3;NULL为系统定义的符号常量.代表整数0.main(){
int
a,b,c,*pmax,*pmin;
printf("inputthreenumbers:\n");
scanf("%d%d%d",&a,&b,&c);
if(a>b){pmax=&a;pmin=&b;}else{pmax=&b;pmin=&a;}
if(c>*pmax)pmax=&c;
if(c<*pmin)pmin=&c;
printf("max=%d\nmin=%d\n",*pmax,*pmin);}【例8.2】利用指针变量求出三个数中的最大值和最小值。a10153bc&b&apminpmaxa10153bc&b&cpminpmax【例8.3】使两个指针变量交换指向。 main() {inta1=10,a2=20;
int*p1,*p2,*p; p1=&a1;p2=&a2;
printf(“%d,%d,&d,&d\n”,*p1,*p2,a1,a2);
p=p1;p1=p2;p2=p;
printf(“%d,%d,%d,%d\n”,*p1,*p2,a1,a2); }10,20,10,2020,10,10,20【例8.4】交换两个指针变量所指向的变量的值。 main() {inta1=10,a2=20,t;
int*p1,*p2; p1=&a1;p2=&a2;
printf(“%d,%d,%d,%d\n”,*p1,*p2,a1,a2);t=*p1;*p1=*p2;*p2=t;
printf(“%d,%d,%d,%d\n”,*p1,*p2,a1,a2); }10,20,10,2020,10,20,108.2数组指针变量8.2.1数组指针变量的定义和引用
1.数组指针变量的定义一般形式为:类型标识符*指针变量名例如:inta[6],*pa;
pa=a;/*数组名a是数组的首地址*/
或pa=&a[0];也可以
inta[6],*pa=a;或inta[6],*pa=&a[2];apaa[1]a[2]a[3]a[4]a[5]a[0]2.数组指针变量的引用(1)数组指针变量与整数的加减算术运算如:
pa+n,pa-n,pa++,++pa,pa--,--pa
(2)两数组指针变量的减运算ap1a[0]a[1]a[2]a[3]a[4]a[5]p2两个指针是不能相加的(3)数组指针变量的关系运算
apaa[1]a[2]a[3]a[4]a[5]pa+2a[0]以存储单元为单位加减p1==p2p1<p2p1>p2p1==0p1!=03.数组元素的引用apaa[1]a[2]a[3]a[4]a[5]pa+2a[0]①pa+i和a+i就是a[i]的地址。②*(pa+i)、*(a+i)与a[i]是等价的。“[]”实际上是变址运算符,即将a[i]按a+i计算地址,然后在此地址中存取所需数据。③注意,*(a+n)与*a+n是完全不同的。④指向数组的指针变量,也可将其看作是数组名,因而可按下标法使用。如pa[i]与*(pa+i)等价。访问一维数组元素,可以用以下两种方法:下标法,即用a[i]或pa[i]的形式访问数组元素。指针法,即采用*(pa+i)或*(a+i)的形式访问数组元素。
aa+1a+2a+3a+4a+5papa+1pa+2pa+3pa+4pa+5pa[0]a[0]a图9.9数组元素的引用pa[1]a[1]pa[2]a[2]pa[3]a[3]pa[4]a[4]pa[5]a[5]所以:对a[i]的引用可以使用:(1)a[i];(2)*(a+i);(3)*(pa+i);(4)pa[i];【例8.5】利用数组指针变量实现一维数组元素的输入和输出#include"stdio.h"main(){inta[6],i,*pa;
pa=a;
for(i=0;i<6;i++){*pa=i;pa++;}pa=a;
for(i=0;i<6;i++){printf("a[%d]=%d\n",i,*pa);pa++;}}apaa[1]a[2]a[3]a[4]a[5]a[0]注意:*pa++与(*pa)++的含义【例8.6】用数组指针变量顺序输出二维数组元素的值。#include"stdio.h"main(){intaa[3][4]={{1,2,3,4},{2,3,4,5},{5,6,7,8}};inti,j,*p=&aa[0][0];for(i=0;i<3;i++){
for(j=0;j<4;j++)
printf("%4d",*p++);
printf(“\n”);
}}for(i=0;i<12;i++){if(i%4)==0
printf(“\n”);printf(“%4d”,*p++);}aaaa[0][0]aa[1][0]aa[2][0]]aa[0][1]aa[1][1]aa[2][1]aa[0][2]aa[1][2]aa[2][2]aa[0][3]aa[1][3]aa[2][3]aa[0]aa[1]aa[2]图8.9二维数组aaaa+0aa[0]aa[0]+j*(aa[0]+j)*(*(aa+0)+j)int[4]int二维数组元素a[i][j]aa+1aa[1]aa[1]+j*(aa[1]+j)*(*(aa+1)+j)aa+2aa[2]aa[2]+j*(aa[2]+j)*(*(aa+2)+j)aa[0]+0aa[0]+1aa[0]+2aa[0]+3*(aa[i]+j)*(*(aa+i)+j)1.二维数组的指针
intaa[3][4]*(aa+0)*(aa+1)*(aa+2)值相同,类型不同8.2.2二维数组指针9.2.3二维数组的指针【例8.7】二维数组的指针示例main(){
intaa[3][4]={{1,2,3,4},{5,6,7,9},{6,7,8,9}};
printf("%x,%x\n",aa,*aa);
printf("%x,%x\n",aa[0],*(aa+0));
printf("%x,%x\n",&aa[0],&aa[0][0]);
printf("%x,%x\n",aa[1],aa+1);
printf("%x,%x\n",&aa[1][0],*(aa+1)+0);
printf("%x,%x\n",aa[2],*(aa+2));
printf("%x,%x\n",&aa[2],aa+2);}9.2.3二维数组的指针对于指向二维数组的指针变量p,可以有两种:一种是指向数组元素的另一种是指向行的,这时,p不是指向一个具体的数组元素,而是指向一个包含m个元素的一维数组。这种指向一行的数组指针变量,称为行数组指针变量,简称行指针相应的将指向二维数组元素的指针变量称为列数组指针变量,简称列指针。
2.指向二维数组的指针变量行指针的定义形式如下:
类型标识符(*指针变量名)[长度];例如:int(*pa)[4],aa[3][4]; pa=aa;
papa+1pa+2aaaa[0][0]aa[0][1] …aa[1][0]aa[1][1]…aa[2][0]a[2][1]…访问二维数组元素,可以用以下两种方法:下标法,用aa[i][j]或pa[i][j]的形式访问数组元素。指针法,采用*(*(pa+i)+j)或*(*(aa+i)+j)或*(pa[i]+j)或*(aa[i]+j)的形式访问数组元素。aaaa+0aa[0]aa[0]+j*(aa[0]+j)*(*(aa+0)+j)int[4]int二维数组元素aa[i][j]aa+1aa[1]aa[1]+j*(aa[1]+j)*(*(aa+1)+j)aa+2aa[2]aa[2]+j*(aa[2]+j)*(*(aa+2)+j)*(aa+0)*(aa+1)*(aa+2)9.2.3二维数组的指针例如:int(*pa)[4];pa=aa;8.2.3指针与字符串1.字符串的表示形式(1)用一维字符数组表示【例8.8】用一维字符数组表示字符串示例#include"stdio.h"main(){inti;charsp[]="Iamastudent.";
printf("%s\n",sp); /*整体引用*/
for(i=0;sp[i]!='\0';i++)
printf("%c",sp[i]);/*逐个引用*/
printf("\n");}8.2.3指针与字符串(2)用字符型指针变量表示【例8.9】用字符型指针变量表示字符串示例#include"stdio.h"main(){char*sp="Iamastudent";
printf("%s\n",sp);/*整体引用*/for(;*sp!='\0';sp++)
printf("%c",*sp);/*逐个引用*/}1.字符串的表示形式【例8.10】将字符串a复制到字符串b#include"stdio.h"main(){chara[]="Howareyou?",b[20];inti;for(i=0;*(a+i)!='\0';i++)*(b+i)=*(a+i);/*指针法*/*(b+i)='\0';printf("stringais:%s\n",a);printf("stringbis:");for(i=0;*(b+i)!='\0';i++)
printf("%c",b[i]);/*下标法*/printf("\n");}【例8.11】用字符型指针变量来处理【例8.10】。#include"stdio.h"main(){chara[]="Howareyou?",b[20],*pa,*pb;
inti;
pa=a;pb=b;
for(;*pa!='\0';pa++,pb++)*pb=*pa;/*指针法*/*pb='\0';
printf("stringais:%s\n",a);
printf("stringbis:");
for(i=0,pb=b;pb[i]!='\0';i++)
printf("%c",pb[i]);/*下标法*/
printf("\n");}3.字符指针变量与字符数组小结(1)存储内容不同:字符数组存储的是字符串本身,每个数组元素存放一个字符;而字符指针变量存放的是字符串的首地址。
(2)赋值方式不同。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。
charstr[20];
str="Iamhappy";而对字符指针变量,可以采用下面方法赋值:
char*pa;
pa="Iamhappy";或
char*pa="Iamhappy";但注意赋给pa的不是字符,而是字符串的首地址。(3)字符指针变量的值是可以改变的;而字符数组名代表字符数组的起始地址,是一个常量,不能改变。8.3指针数组和二级指针变量8.3.1指针数组指针数组的定义形式为:
类型标识符*数组名[长度];其中:“类型标识符”指明指针数组各元素所指向的对象的数据类型。例如:
int*pc[5];定义了一个长度为5的指针数组pc,它的每个数组元素都可指向一个整型变量(或存放一个整形变量的指针)。注意:不要写成int(*pc)[5]【例8.13】分析下列程序的输出结果。#include"stdio.h"main(){char*name[]={"","Monday","Tuesday","Wendesday","Thursday","Friday","Saturday","Sunday"};intweek;while(1)
{printf("EnterweekNo.:");
scanf("%d",&week); if(week<1||week>7)break;
printf("week
No.%d――>
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度系统集成项目工程师聘用合同
- 二零二五年度北京市文物寄存与文化交流合作协议范本
- 业主自制车位合同范例
- 便民货车出售合同范例
- 买混凝土合同范例
- 2025年船用舾装件合作协议书
- 临时聘用劳务合同范例
- 低压电缆安装合同范例
- 丽水专业吊车租赁合同范例
- 特色水景喷泉施工方案
- 小学劳动技术云教三年级下册植物栽培种植小葱(省一等奖)
- 2020年环境法律法规及其它要求清单
- 综采工作面主要设备选型设计方案
- 籍贯对照表完整版
- 2023届高考模拟作文“完美与缺陷”导写及范文
- GB/T 7251.3-2017低压成套开关设备和控制设备第3部分:由一般人员操作的配电板(DBO)
- GB/T 22576.7-2021医学实验室质量和能力的要求第7部分:输血医学领域的要求
- GB/T 16475-2008变形铝及铝合金状态代号
- 2023年江苏省中学生生物奥林匹克竞赛试题及答案
- 《男生女生》优秀课件(共21张PPT)
- 领导干部应对新媒体时代
评论
0/150
提交评论