




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言开放实验指针实验一 指向变量的指针变量编程一实验目的与要求1. 理解指针的概念。2. 掌握指针变量的定义与使用。3. 掌握指针变量作为函数参数的使用方法。二实验题目1. 阅读以下程序,设输入是1 3 5,写出程序的运行结果,再上机验证。#include int fun(int *p) int s=10; s=s+*p; return(s);int main( ) int i, a, b, *p; for(i=0; i3; i+) p=&a; scanf(%d, p); b=fun(p); printf(b=%dn, b); return 0;2. 用指针变量编程,求数组中的最大元素和最小元素。3. 编写函数实现两个数的交换(用指针变量作函数参数),利用该函数交换数组a和b中对应元素的值。(注意:调用函数时实参应为什么值)例如:已知数组a5=1, 2, 3, 4, 5; b5=6, 7, 8, 9, 10; a和b中对应元素交换后:a5=6, 7, 8, 9, 10; b5=1, 2, 3, 4, 5;实验二 字符指针编程一实验目的与要求1. 理解字符指针的概念。2. 掌握字符指针的定义与使用。二实验题目1. 阅读以下程序,先写出程序的运行结果,再上机验证。#include #include int main( ) char *p1, *p2, a20=language, b20=programme; int k, len;p1=a; p2=b; len=strlen(b); for(k=0; klen; k+) if(*p1= =*p2) putchar(*p1); p1+; p2+; return 0;2. 请改正程序中的错误,使程序能得出正确的结果。下列给定程序中,函数fun的功能是:分别统计字符串中大写字母和小写字母的个数。例如:字符串为“ABcdBC#2cdEFghab”,则应输出:upper=6,lower=8#include void fun (char *s, int a, int b) while(*s) if (*s=A & *s=a & *s=z) b+; s+; int main( ) int upper=0, lower=0; char s80; gets(s); fun(s, &upper, &lower);printf(n upper=%d, lower=%dn, upper, lower); return 0; 3. 用字符指针编程求出字符串中指定字符的个数。例如:假设字符串为:“abcdaghckpamn”,指定字符为a,则结果为3。要求:从main函数输入字符串和指定字符,输出结果。实验三 指向一维数组的指针变量编程一实验目的与要求1. 理解指针与数组之间的关系。2. 掌握用指针变量引用数组元素的方法。3. 掌握用指向一维数组的指针变量编程。二实验题目1. 阅读以下程序,先写出程序的运行结果,再上机验证。#includeint main( ) int a10=0, 1, 2, 3, 4, 5, 6, 7, 8, 9; int i, n, temp, *p; printf(输入n(n10):);scanf(%d, &n); for(i=1; ia; p-) *p=*(p-1); *a=temp; for(i=0;i10;i+) printf(%3d, *(a+i); printf(n);return 0;2. 已知一个整型数组,编程将其数组元素的值改为当前元素与相邻的下一个元素的乘积,数组的最后一个元素改为它与第0个元素的乘积,要求用指针变量实现。例如:已知a5=1, 2, 3, 4, 5; 计算后a5=2, 6, 12, 20, 10。实验四 指向二维数组的指针变量编程一实验目的与要求1. 理解二维数组的地址表示方法。2. 掌握用指针变量表示二维数组的元素和元素的地址。3. 掌握用指向二维数组的指针变量的使用。二实验题目1. 阅读以下程序,先写出程序的运行结果,再上机验证。假设输入数据如下:2 5 7 01 -4 3 89 6 -2 5#include#define N 3#define M 4void input(int aNM);void output(int (*p)M);int main( ) int numNM, i, j, flag; printf(输入二维数组num%d%d的数据:n, N, M); input(num); printf(二维数组的数据如下:n); output(num); flag=0; for(i=0; iN & !flag; i+) for(j=0; jM & !flag; j+) flag=*(numi+j)0; if(flag) printf(num%d%d=%dn,i-1,j-1,numi-1j-1); else printf(查找失败!n);return 0;void input(int aNM) int i, j; for(i=0; iN; i+) for(j=0; jM; j+) scanf(%d, ai+j );void output(int (*p)M) int i, j; printf(n); for(i=0; iN; i+) for(j=0; jM; j+) printf(%3d, *(*(p+i)+j) ); printf(n); 2. 用一个二维数组score43来存放4个学生3门课的成绩,编程实现:(1) 输入学生成绩; (2) 求出每个学生的平均分,将其保存在数组a4中; (3) 求出每门课程的平均成绩,将其保存在数组b3中;(4) 输出数组a、b中成绩。要求:用指向二维数组元素的指针变量实现。常见错误及解决方法1. 混淆变量声明中的*号和使用指针变量时的*号。例如:int *p, x=10; *p=&x; /赋值语句错误解决方法:变量声明中的*号是表示该变量是指针类型的变量,而在指针变量时的*号是“指针运算符”,它的作用是取指针变量所指向的存储单元的内容(即取指针变量所指向的变量)。上例正确写法是:p=&x; /令指针变量p指向变量x*p=20; /令p指向的存储单元赋值为20,等价于x=20;2. 在指针变量进行指针运算之前没有给它赋值。例如:int *p;*p=10; /赋值错误指针变量p指向的是一个随机的内存地址,执行*p=10;时,程序则会在p所指向的随机位置处写入一个10,这时程序有可能立即崩溃,也可能等上半小时然后崩溃,或者破坏程序另一部分的数据。编译时会出现以下警告信息:warning C4700: local variable p used without having been initialized警告 C4700:局部变量p在使用前未初始化解决方法:必须先对指针变量进行赋值,令指针变量指向一个明确的存储空间,再对指针变量进行指针运算。上例正确写法是:int *p, x;p=&x; /对指针变量p进行赋值,令p指向x*p=10; /对指针变量p进行指针运算另外,直接使用空指针也是错误的。例如:int *p=NULL; / p不指向任何内存地址*p=10; /无效的空指针引用3. 不同类型的指针混用。例如:int a=3, *p1;float b=1.5, *p2;p1=&a; /正确p2=p1; /错误,p2和p1 的类型不同,不能进行赋值解决方法:相同类型的指针变量之间才能进行赋值。4. 不明确指针变量的当前指向时,使用该指针变量。例如:#includeint main( ) int *p, a3, i, n=1;for(p=a; pa+3; p+) *p=n+; for(i=0; i3; i+, p+) printf(%d ,*p);return 0;程序的输出结果不是1 2 3,而是1245052 1245120 4198713。这是因为在第1个for循环结束时,指针变量p已经指向数组a的末尾了,在执行第2个for循环时,p的起始值是a+3,依次输出a+3、a+4、a+5中的内容,即输出了3个随机数。解决方法:使用指针变量时必须明确指针变量当前所指向的位置。上例中要想正确输出数组a的元素,第2个for循环应该改为:for(i=0,p=a; i3; i+, p+) printf(%d ,*p);5. 混淆数组名与指针变量的区别。例如:#includeint main( ) int i, *p, a5=3, 5, 6, 8, 9;for(i=0; i5; i+) printff(“%d”, a+); /a+错误 p=a; for(i=0; i5; i+) printff(“%d”, p+); /p+正确return 0; 解决方法:必须牢记数组名是一个地址常量,它的值是不可以改变的,而指针变量的值是可以变化的,因此对指针变量可以进行自加运算,对数组名则不行。1. 使用字符指针时可能出现以下错误。例如:char *p1,*p2, *p3=”hello”; /对p3初始化是正确的p1=good; /对p1 赋值是正确的gets(p2); /或用scanf(“%s”, p2); 输入都是错误的使用字符指针变量时,没对指针变量进行赋值,就执行输入操作是错误的,因为字符指针变量指向一个随机的内存地址,程序无法将输入的数据存放到内存中的一个随机位置,编译时会出现警告,程序执行时也会出现运行错误。解决方法:对字符指针变量进行输入操作时,要确保该指针变量指向确定的内存单元。字符指针变量正确的使用方法是:char *p, a10; p=a; /令p指向字符数组agets(p); /或scanf(“%s”, p); 2. 用指向数组元素的指针变量指向一个二维数组。例如:int a3, b23;int *p;p=a; /令p指向一维数组是正确的p=b; /错误,因为二维数组名表示数组第0行的地址解决方法:指向数组元素的指针变量不能直接赋值为一个二维数组名,必须定义一个指向一维数组的指针变量。正确方法是:int b23;int (*p)3;p=b;3. 使用动态内存分配函数时经常出现的错误。(1) 使用malloc( )或calloc( )函数时,忘记进行强制类型转换。例如:int *p;p=malloc(sizeof(int);解决方法:使用malloc( )或calloc( )函数必须使用强制类型转换。上例应改为:p=(int *)malloc(sizeof(int); (2) 忘记使用free( )函数释放malloc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创新管理与组织变革-洞察阐释
- 乐理卷子试题及答案
- 胎盘黄疸与新生儿黄疸的遗传易感性研究-洞察阐释
- 业务合同执行状态跟踪统计表
- 线上线下游戏融合-洞察阐释
- 2025大学食堂餐饮承包合同
- 烟草种植现场调研与质量控制合同范本
- 保密项目参观保密协议书模板
- 车辆抵押贷款风险分析合同模板
- 柴油储备库建设与购销合作协议
- DBJ51 014-2021 四川省建筑地基基础检测技术规程
- PCB 设计技巧
- 消防施工测量记录(建筑分类)
- 八年级初二物理上册期末试卷及答案(人教版)
- 部编版六年级下册道德与法治知识点大汇总
- 汽车维修技术论文两篇
- 心理学基础试卷A
- 电动车使用维修指南
- 中国民航管理干部学院新生报名登记表
- 城市主干道工程监理大纲
- 《2021国标暖通图集资料》14K117-3 锥形风帽
评论
0/150
提交评论