10级实验六 指针与数组 下载本文

实验四 指针与数组

一、实验目的

(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 void main()

{ int *p1,*p2,*p,a,b;

scanf(\ p1=&a; p2=&b; if(a

printf(\//p1指向了a、b中的最大值 }

② 程序二,程序文件名为ex6-2.c 。(掌握指针法和下标法表示数组元素)

#include void main() {

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 void main()

{

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 void main( ) {

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、实验报告写好后将完成的实验报告纸订(或粘)在一起,于下一次上课前交给指导老师。