实验9 指针概念及指针与一维数组的关系
任务1 理解指针及其使用方法
1.阅读分析下面程序,写出运行结果,理解指针概念及“*”与“&”的含义。
#include <stdio.h>
main()
{
int a,b;
int *p1,*p2;
a=100; b=10;
p1=&a;
p2=&b;
printf("a=%d,b+2= %d\n",a ,b+2);
printf("*p1=%d,*p2+2= %d\n",*p1,*p2+2 );
}
运行结果为:
a=100,b+2= 12
*p1=100,*p2+2= 12
2.上机验证下列程序的运行结果。
#include <stdio.h>
void main( )
{
int a,b,*p1,*p2;
p1=&a;
p2=&b;
a=5;
b=7;
printf("\na=%d,b=%d,p1=%dp2=%d",a,b,p1,p2);
printf("\n&a=%d,*&a=%d,&b=%d,*&b=%d\n",&a,*&a,&b,*&b);
}
运行结果如下:(下面红色标记的字,是漏写了的)
a=5,b=7,p1=1245052,p2=1245048
&a=1245052, *&a=5,&b=1245048, *&b=7
思考:在本题中,可不可用&*a来代替*&a?
不能代替,上机验证通不过。所以*号只能写在地址或指针变量的前面,不能写在普通变量的前面。
3.分析下面程序,并运行,理解用指针变量进行输入、输出。
#include <stdio.h>
main( )
{
int *p,m;
scanf("%d",&m);
p=&m; /*指针p指向变量m*/
printf("%d",*p); /*p是对指针所指的变量的引用形式,与此m意义相同*/
}
如从键盘上输入:5
则运行结果为:5
上述程序可修改为如下:
#include <stdio.h>
main( )
{
int *p,m;
p=&m;
scanf("%d",p) ; /*p是变量m的地址,可以替换&m*/
printf("%d",m);
}
如从键盘上输入:5
则运行结果为:5
任务2 使用指针访问一维数组
1.阅读分析下面程序,写出运行结果,理解指针与数组关系。
#include<stdio.h>
main( )
{
int a[]={1,2,3,4,5,6,7,8,9};
int *p=a,b,c,s=0;
for(b=0;b<3;b++)
for(c=0;c<3;c++)
if(b==c) { p++; s+=*p; }
printf("s=%d",s);
}
运行结果为:s=9
2.阅读下面程序,理解指针、数组的多种表示法
#include<stdio.h>
main( )
{
int a[]={1,2,3};
int *p,k;
p=a;
for(k=0;k<3;k++)
{
printf("a[%d]=%d\n",k,a[k]);
printf("p[%d]=%d\n",k,p[k]);
printf("*(p+%d)=%d\n",k,*(p+k));
printf("*(a+%d)=%d\n",k,*(a+k));
}
}
运行结果为:
a[0]=1
p[0]=1
*(p+0)=1
*(a+0)=1
a[1]=2
p[1]=2
*(p+1)=2
*(a+1)=2
a[2]=3
p[2]=3
*(p+2)=3
*(a+2)=3
3.在空格中填上语句,以实现字符串复制的功能。
#include<stdio.h>
main( )
{
char *ps="C language";
char str[15];
char *p1,*p2;
p1=ps;
p2=str;
while(*p1!='\0')
{
*p2=*p1 ;
p1++ ;
p2++ ;
}
*p2='\0';
printf("ps=%s\n",ps);
printf("str=%s\n",str);
}
运行结果为:
ps=C language
str=C language
4.下面程序完成从键盘输入两个字符串a和b,再将a和b的对应位置字符中的较大者存放在数组c中,当一个字符串结束时停止比较,此时将另一个字符串剩下的字符直接放在数组c的后面,填空完成该程序。
#include <stdio.h>
#include <string.h>
void main( )
{
int k=0;
char a[80],b[80],c[80]={'\0'},*p,*q;
p=a;q=b;
gets(a);
gets(b);
while( *p&&*q )
{
if( *p>*q ) c[k]=*p;
else c[k]=*q;
p++;
q++ ;
k++;
}
if(*p!= '\0') strcat(c,p);
else strcat(c,q);
puts(c );
}
5.指出下面程序的问题所在(输出a数组的10个元素),理解指针与数组下标的关系及指针变化情况。
void main( )
{
int a[10];
int *p,k;
p=a;
for(k=0;k<10;k++)
{ *p=k; p++; }
for(k=0;k<10;k++,p++)
printf("%d,",*p);
}
运行结果为:输出10个随机数,原因是当第一个for循环结束后,指针已经指到最后一个元素的下一个地址,此时再输出,已经输出的不是原来存储的数据了。
6.编程实现从键盘输入10个整数,然后求出其中最小值(采用指针实现)。
参考程序如下:
#include<stdio.h>
main( )
{
int a[10],min;
int *p,k;
p=a;
for(k=0;k<10;k++)
{ scanf("%d",p);p++; }
p=a;
min=a[0];
for(k=0;k<10;k++,p++)
if(min>*p)min=*p;
printf("%d",min);
}
实验10 指针与二维数组、函数的关系
任务1 使用指针访问二维数组
1.阅读并运行下列程序,理解访问二维数组元素的多种方法。
#include<stdio.h>
void main( )
{
int a[3][4];
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]); /*数组元素下标表示法*/
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%4d",*(*(a+i)+j));/*数组元素指针表示法*/
printf("\n");
}
printf("\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%4d",*(a[i]+j)); /*数组元素下标+指针表示法*/
printf("\n");
}
printf("\n");
}
如果从键盘上输入:1 2 3 4 5 6 7 8 9 10 11 12
则运行结果为:
1 2 3 4
5 6 7 8
9 10 11 12
1 2 3 4
5 6 7 8
9 10 11 12
2.分析下面程序的输出结果,理解指针与二维数组以及数组指针的概念。
#include <stdio.h>
void f(int (*b)[3]);
void main( )
{
static int a[2][3]={{1,2,3},{4,5,6}};
f(a);
}
void f(int (*b)[3])
{
printf("\n%d %d %d\n",b[0][0],b[0][1],b[0][2]);
}
运行结果为:
1 2 3
思考:如将int(*b)[3]改为int(*b)[2],结果会如何?
运行结果一样。
任务2 熟练掌握指针与函数的关系
1.下面程序完成截取字符串s中从第m个位置开始的n个字符,返回所截字符串的首地址(即指针型函数),认真阅读分析程序,写出运行结果。
#include <stdio.h>
static char sub[20];
void main( )
{
static char s[]="CLanguageProgram";
char *cut(char *s,int m,int n),*p;
p=cut(s,3,4);
printf("%s\n",p);
}
char *cut(char *s,int m,int n)
{
int i;
for(i=0;i<n;i++)
sub[i]=s[m++-1];
sub[i]='\0';
return sub;
}
运行结果为:
angu
2.调用子程序,实现求解一维数组中的最大元素。请填空,完成程序功能。
#include <stdio.h>
main( )
{
int sub_max(int b[],int i);
int n,a[10],*ptr=a; /*定义变量,并使指针指向数组*/
int max,i=10;
for(n=0;n<=i-1;n++)
scanf("%d",&a[n]);
max= sub_max(a,i) ; /*函数调用,其实参是指针*/
printf("max=%d\n",max);
}
int sub_max(int b[],int i) /*函数定义,其形参为数组*/
{
int temp,j;
temp=b[0] ;
for(j=1;j<i;j++)
if(temp<b[j]) temp=b[j];
return temp;
}
此题无空可填,已经是一个完整的程序,它的功能是求从键盘输入10数中最大的那个数。故自己选一个地方加了蓝色和下划线,让学生理解这个地方。
3.阅读下面程序,理解利用指向指针的指针变量对二维字符数组的访问方式。
#include <stdio.h>
#include <stdlib.h>
main( )
{
int i;
static char c[][16]={"c language","fox","computer","home page"};
static char *cp[]={c[0],c[1],c[2],c[3]};
static char **cpp; /*指向字符指针的指针变量*/
cpp=cp; /*将指针数组的首地址传递给指向字符指针的指针变量*/
for(i=0;i<4;i++) /*按行输出字符串*/
printf("%s\n",*cpp++);
printf("-----------\n");
for(i=0;i<4;i++)
{
cpp=&cp[i];
printf("%s\n",*cpp);
}
}
运行结果如下:
c language
fox
computer
home page
----------
c language
fox
computer
home page