zoukankan      html  css  js  c++  java
  • 第八章 指针实验

     

    实验项目:指针实验

    姓名:杨珺茹    实验地点:514教室   实验时间:2019.6.13


    一、目的和要求

    1、掌握指针的概念和定义方法

    2、掌握指针的操作符和指针的运算

    3、掌握指针与数组的关系

    4、掌握指针与字符串的关系

    5、熟悉指针作为函数的参数以及返回指针的函数

    6、了解函数指针

    二、实验内容

    实验练习8.3.1

    1问题的简单描述:

    (1)定义一个整型指针变量p,使它指向一个整型变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整型变量c并赋初值3

    (2)使用指针变量,调用scanf函数分别输入a和b的值

    (3)通过指针间接访问并输出a,b的值

    (4)按十六进制方式输出p,q的值以及a,b的地址

    (5)将p指向c,通过p间接访问c的值并输出

    (6)输出p的值及c的地址,并与上面的结果进行比较

    2、实验代码

    #include<stdio.h>
    int main()
    {
        int *p,a,c=2;
        float *q,b;
        p=&a;
        q=&b;
        printf("please input the value of a,b:");
        scanf("%d%f",&a,&b);//使用指针p和q输入a,b的值
        printf("result:
    ");
        printf("     %d,%f
    ",a,b);
        printf("     %d,%f
    ",*p,*q);//指针p和q间接输出a,b的值
        printf("The Address of a,b:%p,%p
    ",&a,&b);
        printf("The Address of a,b:%p,%p
    ",p,q);//输出p和q的值并与上行输出结果进行比较
        p=&c;
        printf("c=%d
    ",*p);
        printf("The Address of c:%x,%x
    ",*p,p);//输出p的值以及c的地址
        return 0;
    }

    3问题分析:

     

      p=&a,q=&b中,p,q,是a,b的地址;*是取一个指针所指向的单元的值, &是取一个变量的地址;后面有一个输出p,q的值并与上行输出结果进行比较,用p和q与上行*p,*q比较;之后p=&c,p是c的地址,之后输出p的值以及c的地址就很明显了。

    实验练习8.3.2

    1问题的简单描述:

    (1)定义两个函数,分别为void swap1(int a,int b)和swap2(inta.intb),用于交换a,b的值。
    (2)从主函数中分别输入两个整型变量a、b。
    (3)从主函数中分别调用上述两个交换函数,并打印输出交换后a、b的结果。

    2、实验代码

    #include<stdio.h>
    void swap1(int x,int y);
    void swap2(int *x,int *y);
    int main()
    {
        int a,b;
        printf("please input a=:");
        scanf("%d",&a);
        printf("
          b=:");
        scanf("%d",&b);
        swap1(a,b);
        printf("
    After Call swap1:a=%d n=%d
    ",a,b);
        swap2(&a,&b);
        printf("
    After Call swap2:a=%d n=%d
    ",a,b);
        return 0;
    }
    void swap1(int x,int y)
    {
        int temp;
        temp=x;
        x=y;
        y=temp;
    }
    void swap2(int *x,int *y)
    {
        int temp;
        temp=*x;
        *x=*y;
        *y=temp;
    }

    3问题分析:

    最后的交换x,y地址上的值看错了,打成了 temp=&x,&x=&y,&y=temp,这样就是交换x,y地址了。

    实验练习8.3.3

     1问题的简单描述:

    (1)定义两个字符指针,通过gets()函数输入两个字符串。
    (2)定义一个函数charreverse(charstr),通过指针移动方式将字符串反转。
    (3)定义一个函数charlink(charstr1,char*str2),通过指针移动方式将两个字符串连接起来。
    (4)从主函数中分别调用上述函数,输入字符串并打印输出结果。

    2实验代码:

    #include<stdio.h>
    char *reverse(char *str);
    char *link(char *str1,char *str2);
    int main()
    {
        char str[30],str1[30],*str2;
        printf("Input Reversed Character String:");
        gets(str);
        str2=reverse(str);
        printf("
    Output Reversed Character String:");
        puts(str2);
        printf("Input string1:");
        gets(str);
        printf("
    Input String2:");
        gets(str1);
        str2=link(str,str1);
        puts(str2);
        return 0;
    } 
    char *reverse(char *str)
    {
        char *p,*q,temp;
        p=str,q=str;
        while(*p!='')//判断是否到达最后一个字符 
           {
               p++;
            } 
        p--;
        while(q<p) 
        {
            temp=*q;
            *q=*p;
            *p=temp;
            q++;
            p--;
        }
        return str;
    }
    char *link(char *str1,char *str2)
    {
        char *p=str1,*q=str2;
        while(*p!='')
            p++;
        while(*q!='')
        {
            *p=*q;
            p++;
            q--;
        }
        *p='';
        return str1;
    }

    3问题分析:

    字符串均以‘’作为结束字符;q指向的元素赋值到p所指向的元素是指*p=*q;一开始弄反了;指针做相应的移动处理是指后移;结束字符是putch()。

    实验练习8.3.3

     1问题的简单描述:

     (1)定义一个整型一维数组,任意输入数组的元素,其中包含奇数和偶数。
     (2)定义一个函数,实现将数组元素奇数在左,偶数在右的排列。
     (3)在上述定义的函数中,不允许再增加新的数组。
     (4)从主函数中分别调用上述函数,打印输出结果。

    2实验代码:

    #include<stdio.h>
    #define N 10
    void arrsort(int a[],int n);
    int main()
    {
        int a[N],i;
        for(i=0;i<N;i++)
        scanf("%d",&a[i]);
        arrsort(a,N);
        for(i=0;i<N;i++)
        printf("%d ",a[i]);
    }
    void arrsort(int a[],int n)
    {
        int *p,*q,temp;
        p=a;
        q=a+n-1;
        while(p<q)
        {
            while(*p%2==1)
            {
                p++;
            }
            while(*q%2==0)
            {
                q--;
            }
            if(p>q)
            break;
            else
            {
            temp=*p;
            *p=*q;
            *q=temp;
            p++;
            q--;
            }
        }
    }

    3问题分析:

      中间判断*p是否为奇数,中不要漏了*;指针前后移动是+,++;-,--.

    三、实验小结

    这节课熟练了一下那种&,*运算符;

    了解了函数指针;

    因为实验较少,所以可以更好的去思考里面的概念,没有以前那么匆忙的感觉,就挺好······

     

  • 相关阅读:
    LeetCode 1110. Delete Nodes And Return Forest
    LeetCode 473. Matchsticks to Square
    LeetCode 886. Possible Bipartition
    LeetCode 737. Sentence Similarity II
    LeetCode 734. Sentence Similarity
    LeetCode 491. Increasing Subsequences
    LeetCode 1020. Number of Enclaves
    LeetCode 531. Lonely Pixel I
    LeetCode 1091. Shortest Path in Binary Matrix
    LeetCode 590. N-ary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/YANG1116/p/11028600.html
Copyright © 2011-2022 走看看