版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用指针访问数据C语言程序设计 单元八导学【问题1】【问题2】一维数组是占用连续存储空间的数据,如何通过指针变量对这段内存空间进行操作?有一个整型变量a,如何知道该变量的存储地址?如何通过指针变量对a进行操作?目录2用指针操作一维数组3用指针操作二维数组4用字符指针操作字符串1地址与指针 地址与指针5返回地址的函数1地址与指针内存地址编号就是内存地址变量m变量a占1字节占4字节2000 2001 2002 2003 2004 2011 #include stdio.hvoid main() char m; int a; scanf(“%c”,&m); scanf(“%d”,&a); 内存是以字
2、节为单位的连续的存储空间。b1输入:b输入:11地址与指针变量的存储地址2000 2001 2002 2003 2004 2011 b1 变量存储空间的第一个字节对应的内存地址可看作是存储地址。变量m变量a存储地址 根据存储地址就可找到相应的存储单元,所以通常也把地址称为指针。“路标上的地址”可用指针表示。1地址与指针指针变量 C 语言允许用一种类型的变量来存放指针。指针变量 指针变量的值就是某个内存单元的存储地址。 设指针变量pm、pa分别存放变量m、a的存储地址。pa=&a pa的存储地址为2001 2000 2001 2002 2003 2004 2011 b1变量m变量a存储地址pm=
3、&m pm的存储地址为2000 1地址与指针指针变量的定义a*a普通变量指针变量int a;普通变量 a的定义int a;指针变量 a的定义*类型标识符 * 指针变量名;【形式】“指针变量名”前的“*”表示该变量是指针变量,不能省略。“类型标识符”表示该指针变量所指向的变量的数据类型。 一个指针变量只能指向同一类型的变量。【说明】1地址与指针指针变量的定义示例int * p; /定义int型指针变量,变量名为pfloat * pf; /定义float型指针变量,变量名为pfchar * pc; /定义char型指针变量,变量名为pcint *p;int n; p=&n; 等价于int *p=&
4、n; &npnnp指针表示简化的指针表示1地址与指针指针变量的定义示例char str20; /定义char型变量名为str的一维字符数组gets(ps); /为ps所指向的内存空间输入字符串char *ps;ps=str; 等价于char *ps=str; 等价于gets(str);【注意】指针变量也可以被初始化为NULL,它的值为0。当指针值为零时,指针不指向任何有效数据,也称为空指针。1地址与指针指针变量的基本使用int n=10;int *p=&n; 如何引用指针变量p输出n的值?printf(%d,*p); 等价于printf(%d,n);*指针变量名“*”为指针运算符,表示指针变量
5、所指向内存单元的内容。 引用时的“*”不同于指针变量定义语句中的“*”。int *p; “*”是指针标志符printf(%d,*p); “*”是指针运算符【格式】【说明】1地址与指针指针变量的基本使用示例通过指针变量访问的方式计算两个整数之和。#include stdio.hvoid main() int a,b,s; int *pa,*pb; pa=&a; pb=&b; scanf(%d %d,pa,pb); s=*pa+*pb; printf(s=%dn,s);/定义两个整型指针变量pa、pb/使pa指向a/使pb指向b/为pa,pb所指向的内存单元输入值(10、20)/通过指针变量访问的
6、方式求和(30)/输出求和结果/定义整型变量a、b代表两个加数,整型变量s存求和结果&apaa&bpbbs102030输入:10 20301地址与指针指针变量的基本使用示例利用自定义函数add( )计算两个整数之和。#include stdio.hint add(int *pa,int *pb) int sum; sum=*pa+*pb; return sum;void main() int a,b,s; scanf(%d %d,&a,&b); s=add(&a,&b); printf(s=%dn,s);/输入a、b的值(10、20)/求和结果通过return语句返回主函数/add( )是自定
7、义函数,形参pa、pb是指针变量/调用add函数,将&apa、&bpb/形参pa a,形参pb b,实现两个整数求和/输出求和结果&apaa&bpbbs102030&a&bsum30输入:10 20301地址与指针指针变量的基本使用随堂练习#include void add(int *pa,int *pb,int *psum) *psum=*pa+*pb;void main() int a,b,s; scanf(%d%d,&a,&b); add(&a,&b,&s); printf(s=%dn,s);试分析如下程序,看看是否能实现“利用自定义函数计算两个整数的和”?目录1地址与指针3用指针操作二
8、维数组4用字符指针操作字符串5返回地址的函数2用指针操作一维数组 用指针操作一维数组2用指针操作一维数组p=a;int a5;int *p;/建立数组a与指针p之间的关系等价于 p=&a0;如何建立数组a与指针p之间的关系?p p+1 a+1p+2 a+2p+3 a+3p+4 a+4a1a0a2a3a4 a数组 a内存单元2用指针操作一维数组p a+1a1a0a2a3a4 a数组 a内存单元若有如下定义:int a5,*p;p=a;a+1是a1的地址,a+i就是ai的地址。a+i关于地址: a+i&(ai) p+i*(p+i)关于元素: ai*(a+i) 等价关系如下:2用指针操作一维数组示例
9、利用两种方法,输出一维数组各元素地址。#include stdio.hvoid main() int a5,*p,i; p=a; printf(获取数组元素地址:n); for(i=0;i5;i+) printf(&a%d=%pn,i, &ai ); printf(利用指针表示数组元素地址:n); for(i=0;i5;i+) printf(p+%d=%pn,i, p+i );获取数组元素地址:利用指针表示数组元素地址:&a0=0018FF34&a3=0018FF40&a4=0018FF44&a1=0018FF38&a2=0018FF3Cp+0=0018FF34p+1=0018FF38p+2=
10、0018FF3Cp+3=0018FF40p+4=0018FF442用指针操作一维数组示例输出一维数组各元素的值。#include stdio.hvoid main() int a5=10,31,52,3,68,*p,i; p=a; printf(输出数组元素的值(下标法):n); for(i=0;i5;i+)printf(a%d=%dn,i, ai ); printf(输出数组元素的值(下标法):n); for(i=0;i5;i+)printf(p%d=%dn,i, pi ); printf(输出数组元素的值(指针法):n); for(i=0;i5;i+)printf(*(p+%d)=%dn,
11、i, *(p+i) );输出数组元素的值(下标法):输出数组元素的值(下标法):a0=10a3=3a4=68a1=31a2=52*(p+4)=68p0=10p3=3p4=68p1=31p2=52输出数组元素的值(下标法):*(p+1)=31*(p+0)=10*(p+2)=52*(p+3)=32用指针操作一维数组数组名作函数参数 利用函数处理批量数据时,若实参是数组,形参可是数组也可是指针,实参、形参之间传递的是地址。#include stdio.hint sum(int p ,int n) int i,t=0; for(i=0;in;i+) t+=pi; return t;void main(
12、 ) int a5=0,1,2,3,4,s; s=sum(a,5); printf(数组元素之和为:%d.n,s);形参 ( p n )实参 ( a 5 )数组元素之和为:10.用函数计算整型数组各元素之和。2用指针操作一维数组数组名作函数参数#include stdio.hint sum(int *p,int n) int i,t=0; for(i=0;in;i+) t+=*(p+i); return t;void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); printf(数组元素之和为:%d.n,s);数组元素之和为:10.指针表示地址,它可作函数的参数
13、。参数传递后指针指向数组的首地址。01234p aa1a0a2a3a4参数传递过程:用指针作形参,计算整型数组各元素之和。2用指针操作一维数组数组名作函数参数 数组名作实参,对应的形参可是数组也可是指针,形参、实参的数据类型应一致。#include stdio.hint sum(int p ,int n) void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); #include stdio.hint sum(int *p,int n) void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); 形参是数组形参是指针数组名作实参数组
14、名作实参【说明】2用指针操作一维数组数组名作函数参数 进行函数调用时,将数组的首地址传给形参,形参的改变对实参产生影响。 实参与形参共同占用一段内存,在函数执行过程中形参元素值发生变化,实参元素值也会随之改变。#include stdio.hint sum(int *p,int n) *(p+2)=10; void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); printf(数组元素之和为:%d.n,s); printf(“a2=%dn”,a2);a0a1a2a3a4p a相当于:p=a; 24310for(i=0;in;i+) t+=*(p+i); retu
15、rn t;10数组元素之和为:18.a2=10数组元素求和并返回【说明】目录1地址与指针2用指针操作一维数组4用字符指针操作字符串5返回地址的函数3用指针操作二维数组 用指针操作二维数组3用指针操作二维数组二维数组中所蕴含的地址关系int a43=0,1,2, 3,4,5, 6,7,8, 9,10,11;a0a1a2a3 a数组a由4个元素组成: a0、a1、a2 、a3a0包含有 3 个元素:a00、a01、a02,a0a00a01a02a10a11a12a20a21a22a1a2210543876a30a31a32a3910113用指针操作二维数组二维数组中所蕴含的地址关系 a a+1 a
16、+2a代表二维数组的首地址,也是二维数组第0行的首地址。a+1代表第1行的首地址, 。由于第0行有3个整型元素, 所以第1行的首地址为1012, 。 1000 1012 1024设此二维数组的首地址为1000。int a43=0,1,2, 3,4,5, 6,7,8, 9,10,11;a00a01a02a10a11a12a20a21a22210543876a30a31a3291011 a+3 10361个整型变量占4个字节3用指针操作二维数组二维数组中所蕴含的地址关系得出 a0 a1 a2 a0、a1、a2 、a3分别代表二维数组各行的首地址 a0代表第0行中第0列元素的地址 &a00; a0+
17、1即代表第0行第1列元素的地址 &a01;ai+j即代表第i行第j列元素的地址,即&aijint a43=0,1,2, 3,4,5, 6,7,8, 9,10,11;a00a01a02a10a11a12a20a21a22210543876a30a31a3291011 a3【说明】3用指针操作二维数组二维数组中所蕴含的地址关系二维数组元素aij可表示成 可用指针形式表示各元素的地址。a0等价于*(a+0) ,a1等价于*(a+1)。得出ai+j等价于*(a+i)+j,即代表第i行第j列元素的地址a00a01a02a10a11a12a20a21a22210543876a30a31a3291011in
18、t a43=0,1,2, 3,4,5, 6,7,8, 9,10,11; a0 a1 a2 a3*(ai+j)、*(*(a+i)+j)、(*(a+i)j 【说明】3用指针操作二维数组二维数组中所蕴含的地址关系 &aij ai+j *(a+i)+j二维数组元素aij的地址表示方式有:a0a1a2a3a00a01a02a10a11a12a20a21a22a30a31a32 aint a43; aij *(ai+j) *(*(a+i)+j) (*(a+i)j二维数组元素aij的表示方式有:3用指针操作二维数组建立指针与二维数组的关系 数组中的每个元素都是指针变量,根据数组的定义,指针数组中每个元素都为
19、指向同一数据类型的指针。指针数组,就是用指向同一数据类型的指针来构成一个数组。int *p3,i; /定义指针数组p,包含3个指针变量p0,p1,p2int a34=12,3,5,61,60,54,13,8,71,9,19,24;for( i=0; i3;i+) pi=ai;建立指针数组与二维数组之间的关系【示例】3用指针操作二维数组建立指针与二维数组的关系12356160541387191924a0a1a2 a00 a01 a02 a03a10 a11 a12 a13 a20 a21 a22 a23p0 p1 p2pint *p3,i; int a34=12,3,5,61,60,54,13,
20、8,71,9,19,24;for( i=0; i3;i+) pi=ai;3用指针操作二维数组建立指针与二维数组的关系int *p3,i; int a34=12,3,5,61,60,54,13,8,71,9,19,24;for( i=0; i*y) return x; else return y; void main() int *p,i,j; printf(请输入两个整数:); scanf(%d %d,&i,&j); p=f(&i,&j); printf(第一个数为%d,存储地址为:%p.n,i,&i); printf(第二个数为%d,存储地址为:%p.n,j,&j); printf(较大的数为%d,存储地址为:%p.n,*p,p);/函数返回值是指针类型/返回变量x的地址/接收返回值的变量p是指针类型请输入两个整 数:50 10第一个数为50,存储地址为:0018FF40第一个数为10,存储地址为:0018FF3C较
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地理信息系统在交通规划中的应用考核试卷
- 陶瓷考古课程设计
- 2025-2030全球履带衬套和销钉行业调研及趋势分析报告
- 2025年全球及中国本安型防爆称行业头部企业市场占有率及排名调研报告
- 2025-2030全球翻新自行车行业调研及趋势分析报告
- 长理基础工程课程设计
- 车床plc课程设计
- 课程设计总体状况说明
- 花娃娃打扮课程设计
- 项目课程设计实验
- 《项目施工组织设计开题报告(含提纲)3000字》
- ICU常见药物课件
- CNAS实验室评审不符合项整改报告
- 农民工考勤表(模板)
- 承台混凝土施工技术交底
- 卧床患者更换床单-轴线翻身
- 计量基础知识培训教材201309
- 中考英语 短文填词、选词填空练习
- 阿特拉斯基本拧紧技术ppt课件
- 初一至初三数学全部知识点
- 新课程理念下的班主任工作艺术
评论
0/150
提交评论