自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 问答 (1)
  • 收藏
  • 关注

原创 程序员自我修养》系统调用与API

什么是系统调用在现代的操作系统里,程序运行的时候,本身是没有权利访问多少系统资源的。由于系统有限的资源有可能被多个不同的应用程序同时访问,因此,如果不加以保护,那么各个应用程序难免产生冲突。所以现代操作系统都将可能产生冲突的系统资源给保护起来,阻止应用程序直接访问。这些系统资源包括文件、络、IO、各种设备等。为了让应用程序有能力访问系统资源,也为了让程序借助操作系统做一些必须由操作系统支持的行为,每个操作系统都会提供一套接口,以供应用程序使用这些接口往往通过中断来实现,比如 Linux使用0x80号中.

2021-09-17 16:06:00 466

原创 《程序员自我修养》运行库

C语言运行库一个C语言运行库大致包含了如下功能:1. 启动与退出:包括入口函数及入口函数所依赖的其他函数等。2. 标准函数:由C语言标准规定的C语言标准库所拥有的函数实现3. I/O:I/O功能的封装和实现.4. 堆:堆的封装和实现.5. 语言实现:语言中一些特殊功能的实现。6. 调试:实现调试功能的代码。入口函数和程序初始化运行的代码并不是main的第一行,而是某些别的代码,这些代码负责准备好main函数执行所需要的环境,并且负责调用main函数,这时候你才可以在main函数里放心大胆.

2021-09-17 16:02:31 363

原创 C/C++运行库简介

什么是C/C++运行库任何一个C 程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合。另外包括各种标准库函数的实现。这样的一个代码集合称之为运行时库(Runtime Library),C 语言的运行时库,称为 C 运行库(CRT)。C 运行库大致包含的功能:1. 启动与退出函数2. 由C 语言标准规定的C 语言标准库所拥有的函数实现。3. I/O 功能的封装与实现。4. 堆的封装和实现5. 语言中一些特殊功能的实现

2021-09-16 16:47:32 11159

原创 与堆有关的API

进程初始化的时候,系统会在进程的地址空间中创建一个堆。这个堆被称为进程的默认堆。除了进程的默认堆,我们可以在进程的地址空间中创建额外的堆。由于以下原因,我们可能希望在应用程序中创建额外的堆:• 对组件进行保护• 更有效地内存管理• 局部访问• 避免线程同步的开销• 快速释放HeapCreate创建额外的堆HANDLE WINAPI HeapCreate(In DWORD flOptions,In SIZE_T dwInitialSize,In SIZE_T dwMaximumSiz

2021-09-16 14:35:54 437

原创 基础算法学习

1.二叉树的层次遍历描述给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)示例输入:{1,2,3,4,#,#,5}返回值:[[1],[2,3],[4,5]]题解:递归(前序遍历)主要思路:前序遍历,中、左、右左边的节点一定先于右边节点遍历到,加入至对应的数组中,满足层序遍历的要求;要点:1、利用一个level变量标记当前递归的深度,将节点的值push到当前深度的数组的后面;2、level变量大于res数组的size,说明第一次进入二叉树本层,对res扩容;//前

2021-09-10 16:29:48 238

原创 什么是内核对象

何为内核对象作为 Windows软件开发人员,我们经常都要创建、打开和处理内核对象。系统会创建和处理几种类型的内核对象,比如访问令牌(access token)对象、事件对象、文件对象、文件映射对象、IO完成端口对象、作业对象、邮件槽(mailslot)对象、互斥量(mutex)对象、管道(pipe)对象、进程对象、信号量(semaphore)对象、线程对象、可等待的计时器(waitable timer)对象以及线程池工厂(thread pool worker factory)对象等。除了使用内核对象,.

2021-09-10 15:38:49 1080

原创 C++基础知识(3)

析构函数为什么会定义为虚函数?(1)析构函数定义为虚函数时:基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。(2)析构函数不定义为虚函数时:编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。参考:https://blog.csdn.net/King_weng/article/details/892

2021-09-09 17:05:11 123

原创 《程序员的自我修养》内存

内容总结:一般来讲,应用程序使用的内存空间里有如下“默认”的区域。1. 栈:栈用于维护函数调用的上下文,离开了栈函数调用就没法实现。栈通常在用户空间的最高地址处分配,通常有数兆字节的大小。2. 堆:堆是用来容纳应用程序动态分配的内存区域,当程序使用 malloc或new分配内存时,得到的内存来自堆里。堆通常存在于的下方(低地址方向),在某些时候,堆也可能没有固定统一的存储区域。堆一般比栈大很多,可以有几十至数百兆字节的容量。3. 可执行文件映像:这里存储着可执行文件在内存里的映像,由装载器在装载时

2021-09-09 17:02:48 194

原创 《深入解析Windows操作系统》安全性

内容总结:安全系统组件以下是实现 Windows安全性的核心组件和数据库。1. 安全引用监视器(SRM)2. 本地安全权威子系统(LSASS)3. LSASS策略数据库4. 安全账户管理器(SAM)服务5. SAM数据库6. 活动目录7. 认证包8. 交互式登录管理器9. 登录用户界( LogonUI)10. 凭证提供者11. 网络登录服务( Netiogon12. 内核安全设备驱动程序(KSecDD)13. AppLocker这是一种机制,它允许管理员指定哪些可执行文

2021-09-03 14:15:48 987

原创 《程序员的自我修养》Windows下的动态链接

内容总结:导出表当一个PE需要将一些函数或变量提供给其他PE文件使用时,我们把这种行为叫做符号导出(Symbol Exporting),最典型的情况就是一个DLL将符号导出给EXE文件使用。在 Windows PE中,所有导出的符号被集中存放在了被称作导出表(Export Table)的结构中。事实上导出表从最简单的结构上来看,它提供了一个符号名与符号地址的映射关系,即可以通过某个符号查找相应的地址基本上这些每个符号都是个ASCII字符串,我们知道符号名可能跟相应的函数名或者变量名相同,也可能不同,因

2021-09-03 14:12:30 108

原创 虚函数表与虚函数指针关系详解

虚函数表一个类一个吗?1. 虚函数表属于类,类的所有对象共享这个类的虚函数表。2. 不同对象虚函数表是一样的(虚函数表的第一个函数地址相同);3. 每个对象内部都保存一个指向该类虚函数表的指针vptr,每个对象的vptr的存放地址都不一样,但是都指向同一虚函数表。如果一个类中含有虚函数,那么其虚函数表和虚函数指针的归属和存储位置如下所示当一个对象调用了虚函数,实际的被调用函数通过下面的步骤确定:找到对象的 vptr 指向的 vtbl,然后在 vtbl 中寻找合适的函数指针。虚函数表与虚函数指针

2021-09-03 14:09:47 698

原创 win32多线程编程之同步控制

临界区在Win32程序中你可以为每一个需要保护的资源声明一个CRITICAL_SECTION类型的变量.这个变量扮演红绿灯的角色,让同一时间内只有一个线程进入 critical section, Critical section并不是核心对象.因此,没有所谓 handle这样的东西它和核心对象不同,它存在于进程的内存空间中.你不需要使用像Create这样的API函数获得一个 critical section handle.你应该做的是将一个类型为CRITICAL_SECTION的局部变量初始化方法是调用

2021-09-01 18:11:00 269

原创 C++开发基础知识(2)

volatile关键字一般出现在Java中,在C/C++中它的涵义是volatile是java虚拟机提供的轻量级的同步机制,有三大特性:可见性,不保证原子性,禁止指令重排。在C/C++中,volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。volatile的字面含义是易变的,

2021-08-27 11:21:24 104

原创 C++开发基础知识(1)

ping是什么原理?ping 的原理ping 程序是用来探测主机到主机之间是否可通信,如果不能 ping到某台主机,表明不能和这台主机建立连接。 ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息.ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TC

2021-08-26 16:05:31 94

原创 《深入解析Windows操作系统》第五章:进程,线程,作业

内容总结:重难点笔记进程的内部机理数据结构每个 Windows进程都是由一个执行体进程(EPROCESS)结构来表示的。 EPROCESS结构中除了包含许多与进程有关的属性以外还包含和指向了许多其他的相关数据结构。例如,每个进程都有一个或者多个线程,这些线程由执行体线程(ETHREAD)结构来表示, EPROCESS和相关的数据结构位系统空间中,不过,进程环境块(PEB)是个例外,它位于进程地址空间中(因为它包含一些需要由用户模式代码来修改的信息)。受保护的进程受保护进程可以由任何应用程序创建

2021-08-26 15:55:22 325

原创 《程序员的自我修养》之动态链接

内容总结:重难点笔记为什么要动态链接内存和磁盘空间静态链接这种方法的确很简单,原理上很容易理解,实践上很难实现,静态连接的方式对于计算机内存和磁盘的空间浪费非常严重。特别是多进程操作系统情况下,静态链接极大地浪费了内存空间。程序开发和发布空间浪费是静态链接的一个问题,另一个问题是静态链接对程序的更新、部署和发布也会带来很多麻烦。动态链接要解决空间浪费和更新困难这两个问题最简单的办法就是把程序的模块相互分割开来,形成独立的文件,而不再将它们静态地链接在一起。简单地讲,就是不对那些组成程序的目

2021-08-26 15:52:03 166

原创 牛客算法(1)

1.判断平衡二叉树描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。注:我们约定空树是平衡二叉树。示例1输入:{1,2,3,4,5,6,7}返回值:true方法:自顶向下判断一个数是否为平衡二叉树。平衡二叉树是左子树的高度与右子树的高度差的绝对值小于等于1,同样左子树是

2021-08-20 15:38:08 440

原创 力扣算法(2)

1.整数反转给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。示例 1:输入:x = 123输出:321解题:只要能拿到这个整数的 末尾数字 就可以了。以12345为例,先拿到5,再拿到4,之后是3,2,1,我们按这样的顺序就可以反向拼接处一个数字了,也就能达到 反转 的效果。加载器负责的一些主要任务如下所列:1.

2021-08-20 15:29:14 122

原创 《程序员的自我修养》可执行文件的装载与进程

内容总结:重难点笔记:可执行文件只有装载到内存以后才能被CPU执行。进程虚拟地址空间程序和进程:程序(或者狭义上讲可执行文件)是一个静态的概念,它就是一些预先编译好的指令和数据集合的一个文件;进程则是一个动态的概念,它是程序运行时的一个过程,很多时候把动态库叫做运行时( Runtime也有一定的含义。我们知道每个程序被运行起来以后,它将拥有自己独立的虚拟地址空间(Virtual Address Space),这个虚拟地址空间的大小由计算机的硬件平台决定,具体地说是由CPU的位数决定的。硬件决定了

2021-08-19 17:35:38 139

原创 《深入解析Windows操作系统》之管理机制

内容总结:内容重难点笔记:注册表注册表是windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”,也可以说是一个非常巨大的树状分层结构的数据库系统。注册表记录了用户安装在计算机上的软件和每个程序的相互关联信息,它包括了计算机的硬件配置,包括自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据。利用一个功能强大的注册表数据库来统一集中地管理系统硬件设施、软件配置等信息,从而方便了管理,增强了系统的稳定性。注册表文件的数据信息保存在system.

2021-08-19 17:32:38 570

原创 《程序员的自我修养》之Windows PE

内容总结:重难点笔记:COFF文件结构几乎跟ELF文件一样,COFF也是由文件头及后面的若干个段组成,再加上文件末尾的符号表、调试信息的内容,就构成了COFF文件的基本结构,我们在COFF文件中几乎都可以找到与ELF文件结构相对应的地方。CFF文件的文件头部包括了两部分,一个是描述文件总体结构和属性的映像头(Image Header),另外一个是描述该文件中包含的段属性的段表(Section Table)文件头后面紧跟着的就是文件的段,包括代码段、数据段等,最后还有符号表等。文件头里描述COFF文

2021-08-19 17:09:39 155

原创 《深入解析Windows操作系统》之系统机制

内容总结:重难点笔记:陷阱分发:中断和异常是导致处理器转向正常控制流之外代码的两种操作系统条件。硬件或者软件都可以检测到这两种条件。术语陷阱(trap)指的是这样一种机制,当异常或者中断发生时,处理器捕捉到一个执行线程,并且将控制权转移到操作系统中某一固定地址处。在 Windows中,处理器会将控制权转给陷阱处理器(trap handler)。所谓陷阱处理器,是指与某个特定的中断或异常相关联的函数。激活陷阱处理器的条件:中断是一个异步事件(可以在任何时候发生),并且与处理器当前正在执行的任务毫

2021-08-13 17:49:21 715

原创 力扣简单算法(1)

1.盛最多水的容器给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。解题:双指针法:设两

2021-08-13 17:18:17 281

原创 《深入解读Windows操作系统》之系统构架

内容总结:重难点笔记:需求和设计目标:扩展性(Extensibility):编写的系统代码必须能够随市场需求的变化而自如增长和改变。可移植性:系统必须能运行在多种硬件体系架构上,必须能根据市场的需要,相对容易地迁移到新的体系架构上。可靠性(Reliability)和健壮性(Robustness):系统应该能够保护自己,不会因内部的故障和外部的篡改而不能工作。应用程序应该无法伤害操作系统或其他应用程序。兼容性(Compatibility):虽然Windows NT应该扩展已有的技术,但是它的用户

2021-08-11 17:20:16 613

原创 《程序员的自我修养》之目标文件

内容总结:重难点笔记:可执行文件格式:windows -》PE文件,Linux-》ELF文件 (COFF文件变种)。PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等。1. DOS头是用来兼容MS-DOS操作系统的,目的是当这个文件在MS-DOS上运行时提示一段文字,大部分情况下是:This program cannot be run in DOS mode.还有一个目的,就是指明NT头在文件中的位置。2. NT头包含w

2021-08-10 17:26:04 110

原创 SendMessage,PostMessage区别,模态,非模态窗口区别,dialog和普通窗口区别

SendMessage,PostMessage区别PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行。这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。函数原型:LRESULT SendMessage(

2021-08-09 15:28:34 428

原创 《程序员的自我修养》之静态链接

静态链接内容总结:内容重难点笔记:重定位表对于可重定位的ELF文件来说,它必须包含有重定位表,用来描述如何修改相应的段里的内容。对于每个要被重定位的ELF段都有一个对应的重定位表,而一个重定位表往往就是ELF文件中的一个段,所以其实重定位表也可以叫重定位段,我们在这里统一称作重定位表。COMMON块现在的编译器和链接器都支持一种叫 COMMON块( Common Block)的机制这种机制最早源于 Fortran,早期的 Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用

2021-08-02 18:44:34 112

原创 STL源码剖析之序列式容器

序列式容器内容总结:序列式容器重难点:vector概述array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,一切琐细得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。 vector是动态空间,随着元素的加,它的内部机制会自行扩充空间以容纳新元素。vector的迭代器vector选代器所需要的操作行为,如 operator*, operator->, operator++, operator–, operator, operat

2021-08-02 18:39:14 138

原创 程序员的自我修养之编译与链接

编译与链接内容总结编译与链接重难点笔记:预编译:处理“#”开头的预编译指令(.cpp/.c/.hpp到扩展名.ii的转变)。注释,行号,文件名,标识名等处理。编译:把预处理的文件进行一系列的词法分析,语法分析,语义分析以及优化。汇编:汇编代码转化为机器可执行的指令。链接:将文件链接形成可执行文件。编译器过程:扫描(词法分析)-》语法分析-》语义分析-》源代码优化-》代码生成-》目标代码优化(源代码到目标代码的过程)词法分析:有限自动机-》词法记号流语法分析:语法树-》上下文无关文法(LL(

2021-07-29 18:01:45 120

原创 深入解析Windows操作系统之第一章:概念与工具

概念与工具内容总结:概念与工具重难点笔记:操作系统的基本概念与术语Windows API:Windows 32和64位编程接口Windows API函数:指 API中已被文档化的、可被调用的子例程,例如 CreateProcess、 CreateFile和 GetMessage原生的系统服务(或者系统调用):指操作系统中未文档化的、可在用户模式下调用的底层服务。例如, NiCreateUserProcess是一个内部系统服务, Windows的CreateProcess函数调用该服务来创建新的

2021-07-29 17:55:58 940

原创 STL源码剖析之迭代器与traits编程技法

迭代器与traits编程技法内容总结:迭代器与traits编程技法重难点笔记:iterator模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。STL的中心思想在于:将数据容器( containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖胶着剂将它们撮合在一起。其中迭代器就是扮演着粘合剂的作用。迭代器是一种智能指针,最重要的编程工作就是对operator* 和operator->进行重载(overload

2021-07-29 17:50:02 98

原创 读书笔记:STL源码剖析之空间配置器

整个STL的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以置放资料。不先掌握空间配置器的原理,难免在阅读其它STL组件的实现时处处遇到挡路石。空间不一定是内存,空间也可以是磁盘或其它辅助存储介质。allocator可以写一个直接向硬盘取空间。根据STL的规范,以下是 allocator的必要接口allocator:: value_type allocator:: pointer allocator:: const pointer allocator:: reference al

2021-07-24 17:01:05 95

原创 读书笔记:STL源码剖析之STL概论

STL六大部件:容器,算法,迭代器,仿函数,配接器,配置器六大组件的交互关系: Container通过 Allocator取得数据储存空间, Algorithm通过 Iterator存取 Container内容, Functor可以协助 Algorithm完成不同的策略变化, Adapter可以修饰或套接 Functor.STL发展:PH-》PJ-》RW-》SGI常用STL头文件:vector.h deque.h list.h map.h algo.h function.h……SGI头文件

2021-07-24 16:37:05 105

原创 windows常用网络操作

windows下常用网络操作命令ipconfig, ping ,arp,route , netstat, tracertipconfig /all 查看电脑的ip以及DNS详细信息ipconfig(不带参数)当使用IPConfig时不带任何参数选项,那么它为每个已经配置了的接口显示IP地址、子网掩码和缺省网关值。ipconfig /all显示已配置且所要使用的附加信息(比如IP地址),并且会显示置于本地网卡中的物理地址(MAC);如果IP地址是从DHCP服务器租用的,会显示DHCP服务器IP

2021-07-24 11:00:41 636

原创 Win32服务程序编写

在Windows中,有一个特殊的群体,他们天生拥有极高的权限,在一些特殊用户,比如“SYSTEM”的用户中工作。他们享受很高的优待。很多系统功能(更新服务,触摸屏服务。。。)都是以服务运行的WIn32程序编写需要用到的函数详解:BOOL WINAPI StartServiceCtrlDispatcher(In const SERVICE_TABLE_ENTRY *lpServiceTable);函数功能:连接到服务控制管理器参数:一个SERVICE_TABLE_ENTRY结构的指针,成员表中的最

2021-07-22 10:38:53 643

原创 Lib和DLL调用与实现

DLL:Dynamic Link Library 动态链接库 是一个被其他应用程序调用的程序模块,其中封装了可以被调用的资源或函数。DLL 文件属于可执行文件,它符合Windows系统的PE文件格式,不过它是依附于EXE文件创建的的进程来执行的,不能单独运行。现实步骤:IDE新建工程DLLTest1,选择空项目,创建完毕 右击项目 -> 属性 -> 常规 -> 配置类型 选择 动态库.dll添加头文件Calc.h (例子测试)在头文件中添加导出函数add函数#pragma on

2021-07-22 09:27:45 706

原创 RAII与智能指针

什么是RAII?RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化")的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。网络套接字、互斥锁、文件句柄和内存等等,它们属于系统资源。由于系统的资源是有限的,就好比自然界的石油,铁矿一样

2021-07-21 18:36:57 335

原创 OPenCV +vs2015骨架提取二值图像细化快速形态学算法

//根据上述细化算法,在OpenCV中采用3×3结构元素的细化代码如下://函数名称:Mat thinning()//基本功能:对二值图像进行细化运算//参数说明:待细化二值图像,该图像中背景色为0,前景色(目标)为255//返回值:返回细化后二值图像Mat thinning(Mat & binaryImg){ int i, j, k; uchar p[11]; int pos[9][2] = { {0,0},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,

2020-10-30 19:02:58 1926 1

原创 最全HTML笔记总结二

**笔记及代码来源:**https://www.bilibili.com/video/BV1Mx411m7fd**HTML表单**1、表单用于获取不同类型的用户输入2、常用表单标签:<form> 表单<input> 输入域<textarea> 文本域<label> 控制标签<fieldset> 定义域<legend> 域的标题<select> 选择列表<optgroup> 选项组&lt

2020-06-01 09:49:05 368

原创 最详细HTML总结笔记一

笔记与代码来源:https://www.bilibili.com/video/BV1Mx411m7fd<IDOCTYPE html><html><head> <meta charset="UTF-8"> <title>HTML基础</title> </head><body> jikexueyuan hello <h1>标题h1</h1> <h

2020-06-01 09:38:07 275

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除