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

    实验项目:指针实验

    姓名:黄澄    实验地点:514教室   实验时间:2019.6.13

    一、目的和要求

    1、掌握指针的概念和定义方法
    2、掌握指针的操作符和指针的运算
    3、掌握指针与数组的关系
    4、掌握指针与字符串的关系
    5、熟悉指针作为函数的参数以及返回指针的函数
    6、了解函数指针

    二、实验内容

    实验练习8.3.11

    问题的简单描述:

    (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问题分析:

    使用printf来输出指针,可以使用%p、%x格式符来输出16进制的地址值。在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问题分析:

    实验练习8.3.3

    1问题的简单描述

    (1)定义两个字符指针,通过gets()函数输入两个字符串。(2)定义一个函数charreverse(charstr),通过指针移动方式将字符串反转。(3)定义一个函charlink(charstr1,char*str2),通过指针移动方式将两个字符串连接起来。(4)从主函数中分别调用上述函数,输入字符串并打印输出结果。
    当使用指针作为形参时,实参必须是地址,也可以是数组名。

    2实验代码:

    第一个函数swap1(int x,int y)定义时,形参x、y是作为整型变量,当它被调用时,实参的值将被传递给它们,实参变量a、b与形参变量x、y是定义在不同的函数中的局部变量,其存储地址不同,因此在函数swapl内交换x、y的值对主函数中a、b的值不会产生影响。
    #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问题分析:

    编写第一个函数时,将字符串反转,需要使用到两个指针,-个指向起始字符,另一个指向结束字符,相向移动指针,并交换相应位置的字符,注意,这是一个循环过程,需要判断指针条件。
    编写第二个函数时,需要一个指针移动到第个字符串的结束字符0上, 然后将该指针

    实验练习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. q, p向后移动直到遇到偶数,q向前移动,直到遇到奇数,然后将p、q所指位置的元素进行交换,继续循环。
    一个指向维数组的指针加1或减1运算将指向数组的下一个元素或前一个元素。在两个指针的移动过程中,注意处理循环结束条件。

    三、实验小节

    这次实验感觉比较复杂,因为第三个实验检查很多遍都没发现错误,但是不会出结果。力不从心,最后还是参考其他同学的修改,还是没发现错误,心力憔悴。指针还得多加练习呀。

  • 相关阅读:
    积水路面Wet Road Materials 2.3
    门控时钟问题
    饮料机问题
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
    Educational Codeforces Round 82 (Rated for Div. 2)部分题解
    Educational Codeforces Round 86 (Rated for Div. 2)部分题解
    Grakn Forces 2020部分题解
    2020 年百度之星·程序设计大赛
    POJ Nearest Common Ancestors (RMQ+树上dfs序求LCA)
    算法竞赛进阶指南 聚会 (LCA)
  • 原文地址:https://www.cnblogs.com/gudaonihao/p/11032170.html
Copyright © 2011-2022 走看看