实验四 指针与数组
一、实验目的
(1)熟悉指针的概念,并掌握指针变量的定义及使用。 (2)掌握数组的指针和指向数组的指针变量及其应用。 (3)掌握字符串的指针和指向字符串的指针变量及应用。 (4)熟悉指针数组的概念及应用。
二、实验准备
1.指针与数组的基础知识
①指针的定义:
int a; //定义了一个整形变量a
int *p; //定义了一个整型指针,可以存储整型变量的地址
p=&a; //p就指向了a,对a的访问就可以通过p去间接访问。*p=10;就完全等同于a=10; 说明:p指向了a,有p=&a,就有如下关系
1)*p完全等同于a; 2)p完全等同于&a;
3)程序中的*p=10;完全可以用a=10;去替代
4)*p---间接访问目标单元a;a是通过变量名直接访问a。 ②指针与一维数组:
int a[6]={1,2,3,4,5,6},*p; p=a;//完全等同于p=&a[0];
说明:1)a---地址常量,不能自增;
2)p---地址变量,p=&a[0];p++;这时p指向了a[1];如果有*p=10;相当于a[1]=10; 3)p=a;数组元素表示方法有:a[i], p[i], *(a+i), *(p+i) 数组元素的地址表示方法有:&a[i], &p[i], a+i, p+i
③指针与二维数组:
int a[3][4], *p1, (*p2)[4] ; //p1—只能存放列地址,p2---只能存放行地址 p1=&a[i][j]; //等同于p1=a[i]+j; p1=*(a+i)+j; p1=a[0]; //等同于p1=&a[0][0]; p1=*a;
p2=a; //等同于p2=&a[0] for(i=0;i<3;i++) for(j=0;j<4;j++) scanf(“%d”, &a[i][j] ); //&a[i][j]等同于&p2[i][j],p2[i]+j, *(p2+i)+j 说明:1)a---地址常量,且是行指针,a+1,加的是一行;
2)p1----1级指针变量,只能存放列地址,即元素的地址,它的目标单元是二维数组的元素,
p1+1,加的是一列。
3)p2----行指针变量,实质是2级指针,指向的是一行,要通过两次间接访问才能访问数组
的元素。P2+1,加的是一行 4)a, p2, a+1, p2+2-----行指针
*a, p2[0], a[1], *(a+1),*a+1-----列地址 *aa, p2[0][0], *(a[1]+1), a[1][1]----元素
③字符指针
系统规定:1)输出字符指针就是输出指针指向的字符串;
2)输出字符指针指向的目标对象,就是输出指针指向的单个字符。
char *p; p=“I love China!”;
printf(“%s”,p); //输出字符串即”I love China!” printf(“%c”,*p); //输出字符’I’ 字符数组与字符指针的区别说明:
char *p; 与 char str[50]; 1)内存的分配 2)赋值的方式
strcpy(str,”I love china!”); p=“I love china!”;
3)值的改变,str---常量。p---变量
④二级指针
Int a, *p, **q; //a---普通变量,p---1级指针变量,q---2级指针变量
P=&a; q=&p; //一级指针只能存放变量的地址,二级指针只能存放一级指针的地址; *p=10; **q=10; //*p等同于a,*q等同于p,**q等同于a。 说明:1)一级指针通过一次间接访问到目标单元
2)二级指针通过二次间接访问到目标单元。 3)p和q的目标单元都是普通变量a。
2.阅读以下程序,并分析其功能,调试运行程序后再分析其运行结果。
①程序一,程序文件名为ex6-1.c 。(掌握用指针求两个数的最值而不改变两个数原来的值方法)
#include
{ int *p1,*p2,*p,a,b;
scanf(\ p1=&a; p2=&b; if(a
printf(\//p1指向了a、b中的最大值 }
② 程序二,程序文件名为ex6-2.c 。(掌握指针法和下标法表示数组元素)
#include
int a[10],*pa,i;
printf(\请输入10个整数:\\n\ for(i=0;i<10;i++) scanf(\ pa=a;
for(i=0;i<10;i++) printf(\*(pa+i), i,*(a+i)); //用指针法表示 for(pa=a,i=0;i<10;i++) printf(\pa[i], i, a[i]); //用下标法表示 }
③ 程序三,程序文件名为 ex6-3.c 。(用指针处理二维数组的方法)
#include
{
int a[3][4]={{1,2,23,3},{5,85,56,8},{95,10,17,12}};
int i,j, (*p)[4]; //p为行指针,即可以指向一行包含4个整形数的一行 for(p=a,i=0;i<3;i++) {for(j=0;j<4;j++) printf(\*(*(p+i)+j)); //*(*(p+i)+j)等同于p[i][j],a[i][j] printf(\ } }
④ 程序四,程序文件名为ex6-4.c 。(掌握字符指针处理字符串的方法)
#include
char *string=\
printf(\ //输出字符串\ love China!\ printf(\ //输出字符'I'
printf(\ //输出字符串\ }
三、实验内容( 按要求设计以下程序,并调试分析运行结果 ,此部分完成在实验报告上)
(1) 设计程序sy6-1.c,有三个整形变量i,j,k。设置三个指针变量p1,p2,p3,分别指向i,j,k。然后通过指针变量使i,j,k三个变量的值顺序交换,即原来i的值赋给j,把j的原值赋给k,把k的原值赋给i。i,j,k的原值由键盘输入,要求输出i,j,k的原值和新值。
(2) 设计程序sy6-2.c,已知数组{1,3,5,7,9},在其中分别用下标法、地址法和指针法访问数组元素,将它们输出。
(3) 设计程序sy6-3.c,利用字符指针编程,要求在一行文字:“I have 50 Yuan.”中,删去字符‘0’,使其变成:“I have 5 Yuan.”,并输出结果。
(4) 设计程序sy6-4.c,要求输入三行字符(每行不超过80个字符)存于二维字符数组中,统计出其中大写字母、小写字母、空格及其它字符的个数。(要求使用指向一维数组的指针变量)
(5) 设计程序sy6-5.c,请用指向一维数组的指针变量实现二维矩阵的转置,二维矩阵为int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};转置后的结果存在int b[4][3]里面。
四、实验要求:
“实验内容”中的任务要求在实验课上完成,若未完成请在下次上课前利用课外时间完成。
五、实验报告填写要求:
1、第一页用《攀枝花学院实验报告》纸,其后用《实验报告附页》纸。 2、第一页填写项目:
实验课程:计算机基础2-C语言 实验项目:[本次实验名称] 实验日期:[本次实验日期] 系: 班级: 姓名: 学号: 指导教师:
3、实验报告正文要求: 实验目的:(抄写本次实验目的) 实验仪器设备:PC机一套 实验步骤(内容):
(要求完成以上第三部分内容,编程题要求抄写题目并写出程序源代码,并记录程序的运行结果) 实验结论:(分析通过本次实验掌握的知识或是还有什么遗留问题)
4、实验报告写好后将完成的实验报告纸订(或粘)在一起,于下一次上课前交给指导老师。