• 程序设计与数据结构_周立功【读书笔记】


    目的

    封面长这样,讲数据结构的书挺多的,但是我觉得这一本讲的倒是挺有特色的
    比较偏向嵌入式的C语言环境下讲,而不是偏向高级语言而写的。。。
    立个Flag看看要读多久读完
    开始于22年6月27日
    挑我觉得重点或者我不太清楚的知识记录,其他我知道的就不大记录了~~
    在这里插入图片描述

    程序设计基础

    数组

    数组指针相关的知识

    int data0[2]={1,2};
    如果取数组名data0,这个数组名的类型是int[2],如果用typedef处理下,可以用它来构造二维数组

    typedef int T[2];//此时T表示int[2]
    T data[3];//这句话等价于int data[3][2]

    实际试了试还真是这样的,如果这样写,编译器会报告警,指针类型不匹配
    在这里插入图片描述

    在这里插入图片描述
    以下表达式是成立的

    data == data[0]== &data[0] == &data[0][0]

    这里这4个指针都是指向这个数组的首元素,虽然写法不一样

    data是数组名,也就对应指向data[0]的指针,所以它与&data[0]含义一样
    data[0]本身是由2个int值组成的数组[两列],data[0]指向data[0][0],所以data[0]与&data[0][0]含义一样
    data[0]指向的对象【data[0][0]】占用1个int大小,data指向的对象占用2个int,但是&data[0]和&data[0][0]都开始于同一个地址,因此data与data[0]值相同

    有点绕是吧~~~
    在这里插入图片描述
    在这里插入图片描述

    数组指针的偏移问题

    有下面这样语句
    int data[3]
    然后按照书上的说法有下面这些操作,他们的效果各不相同
    在这里插入图片描述
    这里会引出一个很重要的问题,对一个指针,偏移一个数,究竟会产生怎样的效果

    这取决于指针所指向的对象的类型的大小

    书上给出了一个很好的总结
    偏移n后的地址是由data所在的地址加数据类型data所含字节数*n得到

    pData±n = (char )pData±nsizeof(*pData)

    将数组的地址作为形参

    某几个函数的声明是这样的
    void Func0(int data[10]);
    void Func1(int data[ ]);
    上诉函数的形参是指针,不是数组,与int *data是一样的,指向该数组的首元素的指针。
    但是这样的形参的缺点就是不知道数组的长度,最好加一个长度传入
    void Func2(int data[ ],size_t len);
    如果考虑防止修改数组的内容,建议加个const
    void Func3(const int data[ ],size_t len);

    二维数组的地址做形参的问题

    希望传入一个3行2列的数组作为输入参数 给一个函数
    那么它的函数声明为
    int sum(int data[3][2],int size)
    或者
    int sum(int data[ ][2],int size)
    这种写法表明data是由2个int值组成的数组,但是个数不知道,也可以反映为指向int[2]的指针。

    变量的存储

    就是想记下它描述大小端的这段
    如果有int num = 0x00000064,那么A中存放的4字节在不同的CPU里会怎样存呢
    在这里插入图片描述
    在这里插入图片描述
    a是大端模式,b是小端模式

    类型转换

    有一个隐式转换的概念,这个用不好会有坑~

    编译器对操作数隐式地进行自动转换,隐式类型转换将范围窄的数据类型转成更宽的数据类型
    在这里插入图片描述
    举个书上的例子
    unsigned int a =9;
    int b =-4,c;
    c=a/b;
    c的结果是0,为啥呢

    因为a是unsigned int,b是int,编译器会把b隐式转换到unsigned int,由于b是带符号的,转无符号,符号位就变成了正常的有效位了,对应的-4就变成;额0xfffffffc,所以结果是0
    在这里插入图片描述

    指针变量与指针的指针

    const修饰的是紧跟在它后面的单词
    int * const ptr指的是一个指向int的常量指针,指针的指向不能变,但是指向的内容可修改
    const int * ptr指的是一个指向int常量的指针,指针的指向能变,但是指向的内容不可修改

    共性和差异化

    首先找到存在的各种概念(共性)和具体的实现(可变性)。所有的概念都找到 之后,继续封装这些概念的抽象定制接口。如果将问题的共性和可变性分离开时,经过简化后

    把稳定不变的相同的处理部分包含在抽象的模块中,可变性分析发现的变量由外部传递进来的参数对应

    最小化的接口只包含对于接口任务非常重要的参数,同时易于维护和扩展

    依赖倒置原则

    高层次的模块组件独立于低层次的组件,则高层次的模块更容易重用

    高层次的模块不应该依赖低层次的模块,他们应该都依赖于抽象接口
    抽象接口不应该依赖于细节,细节应该依赖于抽象接口

    前/后置条件

    前置条件就是指该函数能够正确输出结果必须成立的条件
    后置条件就是该函数完成后必须成立的条件

    设计这个的初衷时在使用者和程序员之间形成一个契约

    开闭原则

    因为修改接口会导致用户程序的修改,所以只能扩展原有接口,不能修改或废除原有接口

    对修改关闭,对扩展开放

  • 相关阅读:
    高清免费壁纸网站推荐
    Android面试题 - 01
    Tomcat
    Windows及Centos系统升级curl
    Linux中安装MySQL_图解_2023新
    RTSP协议
    嵌入式开发为什么要跑操作系统?
    Rust个人学习笔记
    C++ vector模拟实现
    volatile 系列之实现原理
  • 原文地址:https://blog.csdn.net/tpoem/article/details/125478993