zoukankan      html  css  js  c++  java
  • C博客作业05--指针

    0.展示PTA总分

    1.本章学习总结

    1.1 学习内容总结

    1.1.1指针作为循环变量

    例如:

    int *p;
    int a[];
    for(p==&a;p<=&a+10;p++)   //每次循环指针p指向位置都右移
    {
         循环语句
    }
    

    运用实例:

    1.1.2字符指针表示字符串

    例如:

     char *sp="point";  //定义字符指针指向字符串point(实际是指向其首字符)
     printf("%s",sp);    //输出字符指针指向的字符串
    

    注:字符串常量在内存中的存放位置由系统自动安排,存放字符串首字符的地址称为字符串常量的值。

    1.1.3动态内存分配

    1.1.4指针数组及其应用

    • 概念:指针数组各个元素都是指针类型,用于存放内存地址。
    • 定义:类型名 *数组名[数组长度];
    • 赋值: char *color[5]={“red”,“blue”,“yellow”,“green”,“balck”}; (color[0]指向字符串red)
    • 输出:printf("%s"color[i]); (输出color[i]所指向字符串)

    1.1.5二级指针、行指针

    1.1.5.1普通二级指针

    • 概念:指向指针的指针。
    • 定义:类型名 **变量名;
    • 赋值:
    int a=10;
    int *p=&a;
    int **pp=&p;
    (一级指针p指向整型变量a,二级指针pp指向一级指针p,同级指针变量才能相互赋值,相互加减)
    
    • 表示:p表示变量a的存储内容,pp表示指针p的存储内容,**pp表示指针a的存储内容。

    1.1.5.2二维数组的指针形式

    • 将二维数组a看作是由a[0],a[1],a[2],a[3]...a[i]组成的一维数组,而a[0],a[1],a[2],a[3]各自又是一个一维数组。
    • 数组名a是a[0]的地址,即&a[0],而a[0]即使&a[0][0],所以&a[0]和&&a[0][0]等价。

    1.1.6函数返回值为指针

    • 函数指针定义:
    格式:类型名(*变量名)(参数类型表);
    如:int (*funptr)(int,int);
        定义了一个函数指针funptr,它可以指向有两个整型参数且返回值类型为int的参数。
    
    • 调用:
      在使用函数指针前,要先对其赋值。
      赋值时,将一个函数名赋给函数指针,但该函数必须已定义或声明,且函数返回值的类型和函数指针类型要一致。
      如:funptr=fun;
      一是通过函数名 写成fun(3,5)

    二是通过函数指针 写成(funptr)(3,5) 格式为 (函数指针名)(参数表)

    • 函数指针作为函数的参数
      函数名或者已经赋值的函数指针也可以作为实参,形参便是函数指针,它指向实参代表函数的入口地址

    注意:不能在函数实现时返回函数内定义变量的地址,因为函数结束时这些对象在函数返回时就会消亡。
    因此,函数指针的函数一般都返回全局数据对象或者主调函数中数据对象的地址。

    1.2 本章学习体会

    • 指针的学习过程中我发现其灵活性很强,运用范围很广,比如其可以表示数组和处理数组元素,二级指针和二维数组的联系,指针数组,和指针作为函数返回值等等,
      我学习过程中遇到的问题印象最深刻的就是对于二级指针的运用和表示,以及其与一级指针同时存在分别表示上面,好在我现在可以理解。
    • 代码量420行(pta好多题没做,没完成任务)

    2.PTA实验作业

    2.1 6-5 合并两个有序数组

    题目截图

    2.1.1伪代码(数据处理)

    定义flag并赋值为1
    定义循环变量i
    定义M,N用来暂存a,b数组的长度
    
    while  m,n都不等于0
    do flag=2
       如果 *(a + m - 1) 小于 *(b + n - 1)
       then *(a + m + n - 1) 等于 *(b + n - 1)  n减一
    
       如果 *(a + m - 1) 大于 *(b + n - 1)
       then *(a + m + n - 1) 等于 *(a + m - 1)  m减一
    
       如果  *(a + m - 1) 和 *(b + n - 1)相等  
       then *(a + m + n - 1) 等于 *(a + m - 1);
    	*(a + m + n - 2) 等于 *(b + n - 1);
            m和n都减一
    
    如果m等于0且flag等于2
     将b数组剩下的数字都交到a数组前端
    
    如果M等于0并且flag等于1
     将b数组全部直接移入a数组
    

    2.1.2 代码截图


    2.1.3 总结本题的知识点

    • 通过指针来处理数组,改变数组元素所存储的内容(改变相应地址上的数值)
    • 指针作为函数传递的参数
    • 如何用更简便的算法来将两个有序数组合并而不会超时

    2.1.4 PTA提交列表及说明


    提交列表说明:
    Q1:看到题目第一反应是先将两个数组接起来,再通过选择排序将其重新排列于是沿着思路写下去,在VS上面输入题目所给数据进行测试,
    发现正确然后毫不犹豫将其copy入pta,然后当内部测试数据为100000个数据时就发生了运行超时(如图352ms)。
    A1:先是看了班级里同学的博客后由老师在上机课上讲解,修改了算法,提高了执行效率。
    Q2:输入题给测试数据,发现后面数据都正确但最前面几个数据却重复输出。
    A2:某个变量数据处理出现错误(具体我也忘了),观察修改后题给样例正确
    Q3:错误提示里面a数组长度为0的测试点没过。
    A3:原来是忘记考虑特殊情况,后加了一个if和一个flag用来判断是否进入了数据排序的环节和a数组长度是否为0

    2.2指针做函数返回值) 查找指定字符

    题目截图

    2.2.1伪代码

    定义需查找字符op
    dy指针flag用来接收函数返回值
    定义数组str[100]存储字符串
    定义下标数组indexarrry[101],储存数字0-100
    
    存入字符op,存入字符串str,存入数组indexarry0-100
    
    flag接收函数返回值
    
    如果flag为NULL then没找到
    如果flag不为NULL then输出下标
    
    函数定义int* findindex(char op, char* str,int*indexarry)
    定义index存下标
    定义flag=1判断是否找到相应字符
    
    while 未扫描到字符串中的结束符号
    do
    如果op等于扫到的字符
    存下标  flag=2 
    
    如果flag=1 then返回NULL
    如果flag=2 then返回下标
    

    2.2.2 代码截图



    2.2.3 总结本题的知识点

    • 如何处理函数返回值为指针的情况,如一般分为返回空指针NULL其他
    • 此题我认为有一个难点是题目要求输出下标,而下标是随着你所查找的位置的改变而改变的,其是一个整数
      通过函数来完成寻找下标,但最大的问题是返回值是指针而不是整数,所以此处我就在主函数里面设计了一
      整型数组用来存0-100,并且也作为参数传到函数里面,再找到下标后通过函数传回该下标的相应地址。

    2.2.4 PTA提交列表及说明

    提交列表说明:

    Q1:测试点只有没找到的情况通过了测试,认真观察了自己的代码发现没什么问题
    A1:后来知道原来题目要求输出格式index=n,而我直接输出n
    Q2:解决了问题1后,我再次尝试提交,但还是多个错误。
    A2:发现题目要求寻找的是字符串中满足条件字符的下标而不是其所处第几个
    Q3:解决问题2后还有一个测试点错误,那就是下标为0,并且字符串中有空格的情况。
    A3:我将输入字符串的函数scanf()换成了gets(),才可在字符串中存空格,再在存1-100的数组中加入了0。

    2.3删除字符串中的子串

    题目截图

    2.3.1伪代码

    定义字符串s1,s2,a
    定义指针p
    
    输入字符串s1,s2
    
    while s1中有子串s2
    do 
    将s1中子串后面的字符存入a
    使p所指之处变为字符串结束符,即s1只保留前半部分
    将a连到s1后面
    
    输出s1
    

    2.3.2 代码截图

    2.3.3 总结本题的知识点

    • 如何判断s1中存在子串s2
    • 如何将子串删去
    • 如何判断子串删去后会不会产生新的子串

    2.3.4 PTA提交列表及说明

    提交列表说明:

    因为在vs上面调试过,所以到pta一提交就是正确,提交两次是因为补注释
    Q1:删除子串s2后输出发现子串后面的字符也没了
    A1:增加了暂存字符串a存放子串后无需删除的部分
    Q2:输出发现删除了一次子串又产生了新的子串
    A2:用了while语句来详细指明无需删除的条件,否则一直删除。

    3.阅读代码

  • 相关阅读:
    【设计模式】责任者模式
    【Java工具方法】给集合按数量分组
    【Spring】非Spring IOC容器下获取Spring IOC上下文的环境
    【Java】模板方法模式
    【RabbitMQ】CentOS安装RabbitMQ,及简单的Java客户端连接
    【RabbitMQ】RabbitMQ的一些基础概念
    【Spring】简单的Spring AOP注解示例
    【Web】URI和URL,及URL的编码
    【加密】对称加密算法
    【Normal Form】数据库表结构设计所遵从的范式
  • 原文地址:https://www.cnblogs.com/243050cz/p/11967546.html
Copyright © 2011-2022 走看看