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

    1.本章学习总结

    1.1 学习内容总结

    1.1.1,指针定义:

    int *p;
    float *p;
    char *p;直接对地址进行操作
    指针被定义后,需先赋值后使用(指针赋初值时,只能赋给相同类型的指针)
    不能用数值赋初值,但可以初始化为0,即NULL;
    输出时可以用printf("%.*s",len,p)[len表示输出长度,p表示需要输出的地址]
    

    1.1.2,指针作函数参数

    swap(&a,&b);
    void swap(char *aPstr,char *bPstr);
    传入为地址,指针接收(可以传出多个数值)
    

    1.1.3,数组作函数参数

    int a[10];
    Array(a);
    void Array(int *p);
    在使用时可以用数组形式,也可以用指针形式(即p[mid]可以写为*(p+mid))
    

    1.1.4,字符指针

    字符指针和字符数组都可以用来处理字符串,比如:
    char sa[]="hello";
    char *sp="hello";
    字符数组占用的是一块连续的单元,而字符指针占用的是一个可以存放地址的内存单元
    

    1.1.5动态分配

    p=(int *)malloc(n*sizeof(int))
    动态释放函数free(p)
    malloc对分配的地方不做任何事,而calloc进行初始化
    

    1.1.6指针数组,二级指针,行指针

    一维指针数组定义:类型名  *数组名【数组长度】
    二级指针:类型名* *变量名;
    *变量名 代表的是地址,**变量名代表的是内容
    二维数组用二级指针表示,可以用下标操作也能用指针操作:
    *(a[i]+j)可以写成*(*(a+i)+j)
    定义二维数组时必须指明列长度
    输入多个字符串时,可以用动态分配来处理,每次输入时对每行动态分配空间
    

    1.1.7 指针做函数返回值及其注意

     char* search(char* s,char *p)
     pos=search(s,p)
     返回的需是地址
     不能返回在函数内部定义的局部数据对象的地址
    

    1.2 本章学习体会

    1.在指针这章,我明显感觉到了指针的麻烦,每次在编译时,时不时的就有什么访问权限冲突,溢出呀之类的错误,确实比前面的内容要难一些,有时候最难的就是分不清到底我要定义的是一级指针还是二级指针,总的来说,学习了新的内容,掌握了新的知识,也是成长,也为之感到高兴;
    2.代码量:本周500行代码

    2.PTA实验作业

    2.1 题目名1:本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。

    2.1.1伪代码

    函数定义
    {
         while遍历数组a
              if前一个长度大于后一个长度
                 if判断是否大于最大长度
                    是则将len复值
              else
                  判断后面的字符串长度是否大于len
                     大于则赋值给len
         if判断只有一个字符时,直接返回字符长度
               返回len的长度
    }
    

    2.1.2代码截图

    2.1.3总结本题知识点

    1:注意当字符串数量为1时,情况不一样,需分开讨论
        if(n==1)
        {
            return strlen(s[0]);
        }
    2:strlen函数的用法,用来计算字符串的长度,需包含在string.h的头文件中,如果另写代码完成此功能会增加不必要的代码量
    3.函数传入数组的做法
    int max_len(char* s[], int n)
    

    2.1.4PTA提交列表及说明

    说明:

    1.部分正确:直接考虑的前一的字符串是否大于len,不大于则直接比较下一个,没有考虑第二个字符串是否大于len
    解决:在判断完第一次时,再判断第二个字符是否大于len
    2.部分正确:没有考虑字符串长度为1的情况
    解决:在结束循环后,判断n是否为1,为1直接返回长度
    

    2.2题目名二:给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

    2.2.1 伪代码

    int main
    {
         fgets输入字符串;
         定义整形数len,用来保存每个字符长度
         定义一个指针Pstr指向str,防止改变了原来的地址
         Pstr指到str末尾,从后往前扫描;
         while遍历整个字符串
              if判断是否为空格,不是则
                if判断前一个为是否为空格
                   是则输出len个长度的字符串
         判断开头是否为空格
             为否,则输出最前面的len+1个长度的字符串
    }
    

    2.2.2 代码截图

    2.2.3 总结本题的知识点

    1.输出字符串时,可以用下面的方法输出,可以想输出多少就输出多少字符
      printf(" %.*s", len + 1, Ptre);(len+1表示输出长度)(Pstr表示输出的字符串)
    2.第一个字符不为空格时,需要另外讨论,因为前一个字符不存在
    3.每次输出完时,要记得令len的长度为0
    4.flag的灵活控制
    5.怎么找字符串单词,即当前字符是非空格,而前一个字符是空格
      if(*p!=' '&&*(p-1)==' ')
    

    2.2.4 PTA提交列表及说明

    说明:

    部分正确:最后判断第一个字符时,直接输出,没有考虑是否只是一个单词的情况
    解决:灵活运用到flag来判断他是否执行以上的循环
    部分正确:在编译器上运行调试的时候,并没有加flag进去判断,输出的开头也是错误的
    解决:加入flag判断是否为第一个字符来控制格式
    答案错误:在编译器上运行时,最后if判断里len的长度没加1,导致程序在while里的len是指向第一个字符的,并没有加上它的长度
    解决:len+1,把第一个字符也输出
    

    2.3 题目名三:本题要求实现一个字符串查找的简单函数。

    2.3.1 伪代码:

    指针函数定义
    {
         定义两个新指针,指向传入的两个指针,不改变原来的地址
         while遍历主串
               while主串和子串相同时,同时往后移动
         if判断子串是否结束,结束返回地址;没结束继续遍历,子串回原位
    }
    

    2.3.2 代码截图

    2.3.3 总结本题知识点

    1.指针作函数返回值,返回的必须是地址
      char* search(char* s,char *p)
      pos=search(s,p)
    2.学习指针为空时的状态,返回空指针
    3.子串指针回到起始位置时,主串不移动,continue的灵活运用
    

    2.3.4 PTA提交列表及说明


    说明:(虽然在PTA是一次就过,但在vs上遇到了一些错误)

    部分正确:在判断子串没结束时,没加continue,导致有些情况存在找不到子字符串的情况;
    解决:加上continue后,主串不进行移动,继续从原字符串的位置开始判断;
    部分正确:没有定义新的字符串,在后面时找不到原来字符串的位置;
    解决:根据超星平台上的做法,定义两个指针指向传入的字符串。当我们要对字符串进行操作时,最好定义一个新的字符串指向它,防止找不到原来位置;
    

    3.阅读代码


    1.while(m--)的操作,将两步合在一起,即m--,又判断m是否为0的两步操作
    2.还有就是平时并没有宏定义的习惯,认为没必要,但看到上面这篇题解,没有宏定义的话,如果要修改MAXN的值便更加麻烦了
    3.以及memset函数的用法

    4.ready()以及这个函数,虽然没传入参数,但它将一部分功能分装在里面,应该会使主函数看起来更加简单明了

  • 相关阅读:
    Interesting Finds: 2008.10.27~2008.10.29
    Interesting Finds: 2008.11.21~2008.11.25
    Interesting Finds: 2008.11.31
    Interesting Finds: 2008.10.30~2008.10.31
    Interesting Finds: 2008.11.01~2008.11.07
    Interesting Finds: 2008.10.19~2008.10.23
    Interesting Finds: 2008.11.08~2008.11.11
    Interesting Finds: 2008.11.12~2008.11.14
    Interesting Finds: 2008.11.17~2008.11.18
    Interesting Finds: 2008.10.24~10.25
  • 原文地址:https://www.cnblogs.com/200157zy/p/11965618.html
Copyright © 2011-2022 走看看