zoukankan      html  css  js  c++  java
  • 第三次作业

    一、观看视频1.2.2,1.3.1,1.3.2

    1、视频笔记

     

    2、编写程序代码列表

     

    3、存在的问题:

    (1)分不清scanf函数与gets函数的区别

    解决方法:通过查阅课本,明白scanf函数不能读入空格或Tab,而gets函数可以。

    (2)malloc分配的空间是否连续?

    解决方法:通过上网查阅,了解到使用malloc分配的内存空间在虚拟空间地址上是连续的,

                      但是转换到物理内存空间上有可能是不连续的,因为有可能相邻的两个字符在不同的物理分页上。

     二、观看视频1.4

    1、视频笔记

     

    2、编写程序代码列表

    3、存在的问题:

    1、让一个char*型的指针变量p指向字符串末尾'‘的方法?

    解决办法:查教辅书,先使p指向字符串的第一个字符(即将p赋值为字符串的首地址),然后执行以下程序段:

                       while(*p) p++;

    2、让一个char*型的指针变量p指向字符串的最后一个字符的方法。

          字符串的最后一个字符,也就是‘’的前一个字符。只要先使p指向'‘,再向回移动一个位置(p--;)就可以了。

    4、课堂上理解的问题:

    1、char s1[]={'a','r','r','a','y',''};

         char s2[]="array";

         char *sp="array";

         这三种表示方式都可以。

         "array"是字符串常量,被看作一个特殊的一维字符数组,在内存中连续存在。实质是一个指向该字符串首字符的指针常量。

    2、字符数组与字符指针的重要区别:

         (1) 数组方式,数据会放在数据区(运行过程可以改变)

                   指针方式,数据会放在代码区(整个运行过程中不可以改变)

            (2)sp可以指向别的字符串,sa是数组首元素地址,是常量,无法指向别的字符串。

    3、修改sa的方法:

         (1)sa[0]='A',单个修改字符

         (2)strcpy(sa,"hello");

    三、pta中存在的问题

    1、选择题2-1

              以下不正确的赋值或赋初值的方式(C)

               A、char str[]="string";

               B、char str[7]={'s','t','r','i','n','g'};

               C、char str[10]; str="string";

               D、char str[7]={'s','t','r','i','n','g',''};

                这道题的C选项不太懂。通过询问同学查找资料得知:str是常量指针,因为前面已经指出str只是一个地址,不是变量是不能被赋值的。 char str[10];是定义了一个含有十个元素的数组,而且这十个元素在内存中是以连续的存储单元存放的。其中str是该数组的数组名字,而且str还是该数组的首地址,也就是十个元素中的第一个元素的地址,但务必注意str是一个指针常量,它是不能被赋值的,也不能进行 自增自减的!

    2、选择题2-2

        假设scanf语句执行时输入ABCDE<回车>,能使puts(s)语句正确输出ABCDE字符串的程序段是(D)

           A、char s[5]={"ABCDE"}; puts(s);

          B、char s[5]={'A','B','C','D','E'}; puts(s);

          C、char *s; scanf("%s"); puts(s);

          D、char *s; s="ABCDE"; puts(s);

    此题正确选项是D,但是A和B在编译器中运行时确实能够打印出ABCDE,原因是什么?

      A和B中字符的定义都是字符数组的形式,并不是字符串,即末尾都没有‘’, 非字符串使用字符串函数puts来输出是不正确的。

    A和B这两种情况反倒能输出正确结果的原因是什么?puts函数输出字符串专用,遇到‘’停止输出,找不到就一直输出。
    其实不是涉及到边界对齐,查看下每个字符数组的地址就能看出来了

    存储中的边界对齐存储的知识:按边界储存是指半字、字、双字都按它们各自地址所指定的空间进行储存,而不是随意存放,这样可以保证对一个字长数据的读/写只需要一次存储器访问即可完成,提高了访问效率,但有时会导致储蓄空间浪费,因此,这是一种以储存空间换取储存速度的方法

    字节32位,则半字长16位,双字长64位。则按边界对齐方式的储存要求是:

    双字数据起始地址的最末三位为000(8字节的整数倍)

    单字数据起始地址的最末两位为00(4字节的整数倍)

    半字数据起始地址的最末一位为0(2字节的整数倍)

    一个字节是8个字符,如果字符数组长度是小于8个,比如例题中的5个,那么因为边界对齐存储原因,该字节中只存放5个字符,剩下的3个字符都为0,使用puts函数输出字符数组时,就会把后面的0识别为‘’。而当数组长度是8或者8的倍数时,puts函数找不到后面的0,打印就会出现问题。
    如果我们将数组改为8个元素,那么后面的就需要读取下一个字节中的数据了,对于长度为8个元素或者8的倍数的字符数组使用puts函数,结果就不正确了。

      

  • 相关阅读:
    iOS push
    iOS Beta 升级或降级
    Charles SSL
    看懂UML类图和时序图
    UML示例图 zt
    一个二维码-->网址-->iOS/Android跳转
    获取Shell脚本当前的目录
    编辑请求内容 Charles
    adjustsFontSizeToFitWidth 与 NSLineBreakByCharWrapping 无法共用
    js数据类型
  • 原文地址:https://www.cnblogs.com/wjb13579246/p/12488037.html
Copyright © 2011-2022 走看看