知ing

大学C/C++语言程序设计实验教程

阳小华 罗晨晖 编 / 电子工业出版社

王大胆 上传

查看本书

实验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.下面程序完成从键盘输入两个字符串ab,再将ab的对应位置字符中的较大者存放在数组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


查看更多