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()以及这个函数,虽然没传入参数,但它将一部分功能分装在里面,应该会使主函数看起来更加简单明了

  • 相关阅读:
    打造基于CentOS7的xfce最简工作环境
    Linux下C程序的编辑,编译和运行以及调试
    修正 XE6 TListView 上方 SearchBok 右边的清除钮显示
    TabControl 显示彩色的图示 (XE6 Firemonkey)
    TSwitch 中文简繁显示支持(XE6 Android)
    改变 TMemo 的背景颜色 (Firemonkey)
    修正 XE5 Android 键盘三个问题
    Delphi 收藏
    展示 Popup 的使用方法
    ListView 下拉更新 (支持 Android)
  • 原文地址:https://www.cnblogs.com/200157zy/p/11965618.html
Copyright © 2011-2022 走看看