0%

功率半导体器件

分类

graph LR
A[功率半导体器件]-->B[功率二极管]-->单极型二极管
B-->双极型二极管
A-->C[功率开关器件]-->晶闸管类器件
C-->D[功率晶体管]-->功率MOS器件
D-->功率双极晶体管
D-->IGBT

发展

  1. 功率二极管

    • 单极型二极管(应用于低于100V的场合)

      肖特基结构二极管

      image-20211026222224328

      采用肖特基结构适合

      • 优点:没有电导调制效应,所以反向恢复速度特别快

      • 缺点:1)没有电导调制效应,所以通态导通电阻较大

        ​ 2)肖特基结构拥有镜像势垒降低效应和遂川效应,使得反向漏电流较大

      为了改进反向漏电流大的问题,于是在肖特基的基础上引入PN结

      结势垒肖特基二极管(JBS结构二极管)

      image-20211026223257275

      引入PN结,在正向导通时不注入,只是用来改善反向阻断特性,适合在低压高频场合

    • 双极型二极管

      PiN结构二极管

      image-20211026223751556
      • 优点:可以实现大功率(高压,大电流),即不仅能承担高压,而且通态导通电阻小(PN结在正向时,在N-区中注入大量非平衡载流子,产生电导调制效应)
      • 缺点:因为电导调制效应,所以反向恢复时间较长,不太适合高频

      MPS结构二极管

      image-20211026224919997

      将肖特基结构引入到PiN二极管中,正向导通时,注入电流,在N-区中有电荷的存储,有电导调制效应,同时改变了载流子的分布,反向恢复特性有了较大的改善

      SSD结构二极管

      image-20211026225613007

      SPEED结构二极管

      image-20211026225638592
  2. 功率开关器件

    • 晶闸管(功率开关器件中具有最高耐压容量与最大电流容量的器件,即功率容量最大的器件)

      • 普通晶闸管(半控型晶闸管)

      • GTO(门极可关断晶闸管)

        image-20211026231030658

        关断增益≈3-5,即门极(门极为多个小单元组成)电流小于阴极电流,所以会在关断过程中造成不均匀关断(靠近门极先关断)

      • IGCT(集成门极换流晶闸管,关断增益为1的GTO)

        image-20211026231848590
    • 功率双极晶体管(IGBT完全优于,基本被淘汰)

    • 功率MOSFET

typora的使用技巧

流程图

  • 创建空白流程图

    1
    2
    3
    4
    5
    6
    7
    <pre class="mermaid"> </pre>

    - 定义流程图方向

    ```markdown
    graph LR//横向流程图
    graph TD//纵向流程图
  • 编辑内容

    1
    2
    A[社交软件]-->B[微信]//A到B("-->"实线箭头;"[]"用其中内容填充)
    A-->C[QQ]//已经有的,无需再次增加"[]"
graph LR
A[社交软件]-->B[微信]
A-->C[QQ]
A-->D[微博]
B-->E[朋友圈]
B-->F[拍一拍]
B-->G[发红包]
C-->G
C-->H[空间]
D-->K[热搜]

HTML

Hyper Text Markup Language超文本标记语言

HTML框架

1
2
3
4
5
6
7
8
9
<!DOCTYPE html>	
<html long="en">
<head>
<title>TAG</title>
<meta charset="UTF-8">
</head>
<body>
</body>
</html>

常用标签

基础标签

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>	
<html long="zh">
<head>
<title>网页标题</title>
<meta charset="UTF-8">
</head>
<body>
<h1>内容标题</h1><hr><!--此处添加水平线-->
<p>
此处为<br>段落内容
</p>
</body>
</html>
标签 功能 应用
<DOCTYPE> 定义文档类型 <!DOCTYPE html>
<html> 定义一个HTML文档 <html long="zh">内容</html>
<title> 为文档定义一个标题 <title>标题</title>
<body> 文档的主体 <body>主体</body>
<h1>to<h6> HTML标题 <h1>标题</h1>
<p> 一个段落 <p>内容</p>
<br> 换行 <br/>
<hr> 水平线 <hr>
<!----> 注释 <!--需要注释的内容-->

格式标签

标签 功能 应用
<abbr> 定义一个缩写 <abbr title="蹲坑">dk</abbr>
<address> 定义文档作者/所有者的联系信息 <address>地址联系信息</address>
<b> 加粗(无语义) <b>文本</b>
<bdi> 设置一段文本,使其脱离其父元素的文本方向设置 <bdi>文本</bdi>
<bdo> 定义文本方向(rtl&ltr) <bdo dir="rtl">文本</bdo>
<blockquote> 块引用(cite) <blockquote cite="url">引用内容</blockquote>
<cite> 定义作品的标题(书籍、歌曲、电影等) <cite>作品标题</cite>
<code> 定义计算机代码文本 <code>代码</code>
<del> 删除线 <del>要删除的文本</del>
<dfn> 定义项目 <dfn>项目名</dfn>
<em> 倾斜字体(语义较强) <em>字体</em>
<i> 倾斜字体(无语义) <i>需倾斜文本</i>
<ins> 定义删除后新插入的文本 <del>red</del><ins>blue</ins>
<mark> 高亮文本 <mark>文本</mark>
<meter> 已知最大最小值的度量
value(必须):规定当前值
max:规定最大值;min:规定最小值
high:规定最高值;low:规定最低值
optimum:规定最优值
<meter value="2" min="0" max="10">2 out of 10</meter>
<meter value="0.6">60%</meter>
<progress> 定义运行任务进度 <progress value="22" max="100"></progress>
<q> 定义短的引用 <q>引用内容</q>
<rp> 定义不支持 ruby 元素的浏览器所显示的内容 <ruby><br/>汉 <rt><rp>(</rp>ㄏㄢˋ<rp>)</rp></rt><br/></ruby>
<rt> 定义字符(中文注音或字符)的解释或发音 <ruby><br/>汉 <rt> ㄏㄢˋ </rt><br/></ruby>
<ruby> 定义ruby注释(中文注音或字符) <ruby><br/>汉 <rt> ㄏㄢˋ </rt><br/></ruby>
<s> 删除线 <s>文本</s>
<strong> 加粗(语义较强) <strong>文本</strong>
<sub> 下标文本 <sub>文本</sub>
<sup> 上标文本 <sup>文本</sup>
<time> 定义公历时间(24)或日期 The concert starts at <time>20:00</time>
The concert took place on
<u> 下划线 <u>文本</u>

表单标签

标签 功能
<form> 定义一个表单域
<input> 定义一个输入控件
type:
button:定义一个按钮。
file:选择文件
submit:提交按钮(点击后会向后台提交所选表单域中的信息)
search:搜索框
password:密码框
date:选择时间框(年-月-日)
text:单行文本
datetime-local:选择年月日时分
tel:电话号码
radio:单选按钮(需要给相同的name)
checkbox:复选按钮
color:选择颜色
email:邮箱
number:输入数字
reset:重新输入
week:多少年的第几周
<textarea> 多行文本输入框<textarea>自定义内容</textarea>(写一行,否则光标不在左上)
<select> 下拉选择列表<select>option*N</select>
size:规定下拉菜单中可见的选项数目
required="required":必须要选一个
multiple="true":可选多个选项
<optgroup> 选择列表中相关选项的组合{option*N}N
<option> 选择列表中的选项
<label> input元素的标注(不点击控件,点链接到的文字也可以定位到控件)
<label for="male">Male</label>
<input type="radio" name="sex" id="male" value="male">
<fieldset> 围绕表单中元素的边框
<legend> 定义fieldset元素的标题
<datalist> 规定input元素可能的选项列表
<keygen> 用于表单的秘钥对生成器字段
<output> 定义计算的结果

图像及超链接标签

<img>

作用:向网页中嵌入一张图片

应用:<img src="url" alt="图片加载不出来时的代替文本" title="鼠标放到图片上的介绍文本">

Note:绝对路径用“”;相对路径用“/”

<a>

作用:超链接

应用:<a href="链接地址" target="_blank">连接描述</a>(内部、外部链接)

​ <a href="#">链接描述</a>(空链接)

​ <a href="文件地址、压缩包地址">下载文件</a>(文本、图片、视频、音频等均可以为超链接)

​ <a href="#age">年龄</a>

​ <h3 id="age">年龄详情</h3>(锚点链接)

Note:

  • 默认为_self(当前窗口打开)
  • _blank(新窗口中打开)
  • ​ _top(整个窗口中打开)

列表标签

标签 功能 应用
<ul> 定义一个无序列表 <ul><li><li></li></li><</ul>
<ol> 定义一个有序列表 <ol><li><li></li></li></ol>
<li> 定义列表项 <ol><li><li></li></li></ol>
<dl> 定义一个定义列表 <dl><dt>电脑</dt><dd>电脑的解释</dd></dl>
<dt> 定义列表中的项目 <dl><dt>电脑</dt><dd>电脑的解释</dd></dl>
<dd> 定义列表中的项目描述 <dl><dt>电脑</dt><dd>电脑的解释</dd></dl>

Note:

  • <ul><ol>里面只能放<li>标签,<li>标签里面可以放弃他标签

  • <dd>中的内容是<dt>中内容的说明或是包含于<dd>内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <!DOCTYPE html>
    <html long="en">
    <head>
    <meta charset="UTF-8">
    <title>列表</title>
    </head>
    <body>
    <div>
    <ul>
    <li>洗衣机</li>
    <li>冰箱</li>
    <li>空调</li>
    </ul>
    <ol>
    <li>太阳</li>
    <li>地球</li>
    <li>西安</li>
    </ol>
    <dl>
    <dt>跨栏</dt>
    <dd>是一项运动</dd>
    <dd>奥运会项目</dd>
    <dd>刘翔是冠军</dd>
    </dl>
    </div>
    </body>
    </html>

表格标签

标签 功能
<table> 定义一个表格
border="num"定义边框宽度
<tr> 定义行
<td> 定义单元格
colspan:规定单元格可横跨的列数
rowspan:规定单元格可横跨的行数
<th> 定义表头单元格(使内容居中加粗)
<thead> 定义表头整行
<tbody> 定义表格主题内容
<tfoor> 定义表注(脚注)

Note:

  • 合并单元格时,选定操作目标单元格后,需要删掉被合并单元格的代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>表格</title>
    </head>
    <body>
    <table border="1">
    <thead>
    <tr>
    <th>序号</th>
    <th>姓名</th>
    <td>年龄</td>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>1</td>
    <td>张佳佳</td>
    <td>24</td>
    </tr>
    <tr>
    <td>2</td>
    <td>张亮亮</td>
    <td>33</td>
    </tr>
    <tr>
    <td rowspan="2">3</td>
    <td>张盼盼</td>
    <td>22</td>
    </tr>
    <tr>
    <td>张志荣</td>
    <td>63</td>
    </tr>
    <tr>
    <td>4</td>
    <td colspan="2"></td>
    </tr>
    </tbody>
    </table>
    </body>
    </html>

样式/节标签

元信息

CSS

CSS基础知识

初识CSS

1. CSS结构

h1 {color:red; font-size:25px;} 选择器 {属性:值; 属性:值;}

Note:

  • 展开格式
  • 小写字母书写
  • 值前面留一个空格;选择器之后留一个空格

2. CSS三大特性

特性 原则
层叠性 1. 就近原则
2. 样式不冲突,不会层叠
继承性 1. 子元素可以继承父元素的某些样式(text、font、line-、color等属性)
2. 行高的继承性body {font:12px/1.5 Microsoft Yahei;}
行高可以跟单位也可以不跟单位
如果子元素没有设置行高,则会继承父元素的行高为1.5
此时子元素的行高是:当前元素的文字大小*1.5
优先级 继承或者*:0000
元素选择器:0001
类选择器,伪类选择器:0010
ID选择器:0100
行内样式style="":1000
!important:无穷大
Note 权重相加永远不会有进位,,后者永远比前者高
继承的权重永远是0
复合选择器权重会叠加

3. Emmet语法

方法 作用
写1个标签按TAB键 快速生成标签
div*3 生成多个标签
ul>li 父子级关系标签
div+p 兄弟级关系标签
.nav #foot 带有类名或者ID的标签
div$ 生成的div有顺序,从1开始
div{} 生成的标签内部写内容
缩写 CSS中的快速写法
格式化 右键

4. CSS的元素显示模式(2+1)

类型 特点 Note
块元素 1. 独占一行
2. 高和宽及内边距可控制,默认宽度是容器(父级宽度)的100%
3. 是一个容器,里面可以放行内或者块元素
文字类的元素内不能使用块级元素
行内元素 1. 一行可以显示多个
2. 高和宽设置是无效的
3. 默认宽度是本身内容宽度
4. 行内元素只能容纳文本或者其他行内元素
1. 链接里面不能再放链接
2. <a>里面可以放块级元素,但最好给<a>转化成块级模式
行内块元素<img><input><td> 1. 一行可以显示多个,之间会有空隙
2. 默认宽度为本身内容宽度
3. 高和宽及内边距可控制
display: block
    <td>转换为块元素</th>
</tr>
<tr>
    <td>display: inline</td>
    <td>转换为行内元素</td>
</tr>   
<tr>
    <td>display: inline-block</td>
    <td>转换为行内块元素</td>
</tr>   

5. CSS属性书写顺序

布局定位属性:display / position / float / clear / visbility / overflow(建议display第一个写)

自身属性:width / height / margin / padding / border / background

文本属性:color / font / text-decoration / text-aline / vertical-align / white-space / break-word

其他属性:content / cursor / border-radius / box-shadow / text-shadow / background:linear-gradient...

6. CSS引入方式

类型 语法 note
内部样式表 <style>CSS</style> /
| 行内样式表 |

</p> | / | | 外部样式表 | <link rel="stylesheet" href="css文件路径"> | <head>内部 |

选择器

1. 基础选择器

1.1 标签选择器
1
2
3
4
a {
color: red;
font-size: 25px;
}
1.2 类选择器(class)
1
2
3
4
5
.类名 {
属性:属性值;
属性:属性值
......
}

Note:

多类名:<div class="red" font-size></div>(多个类名中间用空格隔开)

1.3 id选择器
1
2
3
4
#id名 {
属性:属性值;
......
}
1.4 通配符选择器
1
2
3
4
* {
属性:属性值;
......
}

2. 复合选择器

2.1 后 代选择器(全部后代元素)

ol li {color: red;}

.nav li {color:red;}

1
元素1 元素2 {属性: 属性值;}

Note:

  • 元素1和元素2之间用空格隔开
  • 元素2是元素1的所有后代li,包括儿子、孙子......
  • 元素1、元素2可以为任意基础选择器
2.2 子选择器(亲儿子)

din>p {color: red;}

1
元素1>元素2 {属性:属性值;}

Note:

  • 元素1和元素2之间用>隔开
  • 元素2必须是亲儿子
2.3 并集选择器

ul,div {color:red;}

1
元素,元素 {属性:属性值;}

Note:

  • 元素1和元素2之间用,隔开
  • 并集选择器通常用来集体声明
  • 任何选择器都可以作为并集选择器的一部分
2.4 伪类选择器(向某些选择器添加特殊效果)
类型 语法 Note
链接伪类 a:link 选择所有未被访问的链接
a:visited 选择已被访问的链接
a:hover 选择鼠标指针位于其上的链接
a:active 选择活动链接(鼠标按下未弹起的链接)
1. 按照LVHA顺序申明LOVE HATE
2. 链接需要单独指定样式
3.常用写法:
a {color: gray;}
a:hover {color:red}
:hover可以跟其他标签
表单伪类 input:focus{background: yellow;}

CSS属性

1. CSS字体属性

属性 属性值
font-family "Microsoft YaHei", Arial, Helvetica, Sans-serif...... 用逗号隔开;
组合形式用引号包起来
font-size xpx; Google默认16px
font-weight normal(默认), bold(粗体),b older(更粗的字符), lightet(更细的字符),100-900(常用)(400:normal 700:bold 无单位) 数字无单位
font-style normal(默认), italic(斜体) 倾斜字体变正常
font font-style font-weight font-size/line-height font-family; 洋醋小高字体;黄色必须有

2. CSS文本属性

属性 属性值s Note
color red、#fff、rgb(255,0,0) /
text-align center、 left、right /
text-decoration none、underline、overline、line-through 取消下划线(比如a)
text-indent xpx 或者 2em 段落首行缩进
line-height xpx 行高等于盒子高度:文字垂直居中

3. css背景

功能 语法 说明
背景颜色 background-color: 颜色值;
background: rgba(0,0,0,0.3);(半透明)
颜色值(transparent透明)
最后一个值是alpha透明度,取值在0-1之间,可以省去0,直接写.3
背景图片 background-image: none | url(url); 页面可以同时添加背景颜色和图片,图片在顶部
背景平铺 background-repeat: repeat | no-repeat | repeat-x | repeatj-y
背景图片位置 background-position: x y;(方位名词left | right | top | bottom或者精确单位xpx ypx;混合单位) 方位名词:与顺序无关;省略其中一个则默认居中
精确单位:x、y坐标不能更换位置;不指定Y值,则默认居中
混合单位:第一个是X值
背景图像固定 background-attachment:scroll | fixed; scroll:随内容滚动
fixed:固定
复合写法 background:背景颜色 背景图片 背景平铺 背景图像滚动 背景图片位置(无顺序,习惯性写法) 颜色图片平铺滚动位置

4. 圆角边框&盒子阴影

功能 语法 Note
圆角边框 border-radius:xpx | 百分比
border-radius:xpx ypx zpx wpx;(左上、右上、右下、左下)
高度一半或者50%是圆
盒子阴影 box-shadow:h-shadow v-shadow blur spread color inset;
h-shadow:必须,水平阴影位置,允许负值
v-shadow:必须,垂直阴影位置,允许负值
blur:可选,模糊距离
spread:可选,阴影尺寸
color:可选,阴影的颜色
inset:可选,将外部阴影(outset)改为内部阴影
盒子阴影不占用空间,不会影响其他盒子排列
文字阴影 text-shadow:h-shadow v-shadow blur color;
和盒子阴影一样

5. vertical-align属性

作用:经常用于设置图片或者表单(行内块元素)和文字垂直对齐(只针对于行内或行内块元素

语法:vertical-align:baseline(默认,基线对齐) | top(顶端对齐) | middle(中间对齐) | bottom(底端对齐);

应用:图片于文字等垂直居中&&(清除图片下面的空隙,变成块元素也可解决)(因为默认于基线对齐,留给类似于P字母等的)

盒子模型

1. 盒子元素

包括:边框(border)、内边距(padding)、外边距(margin)、实际内容(content)

padding:容器边框到内部另一容器边框的距离;

margin:容器边框到外部另一容器边框的距离;

盒子 语法 Note
边框 border-top; border-left; border:right; bottom;(可以单独设置)
border-width: xpx;
border-style: solid | dashed | dotted;
border-color: 颜色值;
border: 1px solid red;(无顺序)
border-collapse: collapse;(相邻边框合并在一起)
边框会影响盒子的实际大小
padding padding-left; padding-right; padding-top; padding-bottom
padding:xpx ypx zpx wpx;
1个值:上下左右均为x;
2个值:上下为x,左右为y;
3个值:上为x,左右为y,下为z;
4个值:上右下左(顺时针)
1. padding会影响盒子大小
2. 如果不指定盒子高和宽属性,则此时padding不会撑开盒子
margin 与padding一致
margin: 0 auto;(盒子居中,前提是盒子有设置宽度)
1. 行内元素或者行内块元素水平居中(给其父元素添加text-align: center)
2. 外边距合并:相邻盒子的相邻边同时设置margin,会以较大的为准,并不是两者之和(一般只设置一个)
3. 两个嵌套关系(父子)的块元素,父元素有上外边距同时子元素也有上外边距,此时父元素会塌陷较大的外边距(1. 父元素设置边框 2.父元素定义内边距3. 添加overflow: hidden;4. 浮动、固定、绝对定位等)
content 盒子里面的内容
清楚内外边距 * {margin:0;padding:0;}

2. 浮动

语法: 选择器 {float:none | left | right;}(任何元素都可以添加浮动)

浮动特性:

  1. 浮动元素会脱离标准流(脱标)
  2. 浮动的盒子不再保留原来的位置
  3. 浮动的元素会一行内显示并且元素顶部对齐
  4. 浮动的元素会具有行内块元素的特性(行内元素添加了浮动,则不需要转换模式)

Note:

  • 浮动和标准流的父盒子搭配

  • 一个盒子浮动了,理论上其他兄弟元素也要浮动

  • 浮动的盒子只会影响浮动盒子后面的标准流,不会影响前面的标准流

3. 清除浮动

原因:由于父盒子很多情况下不方便给高度,但浮动后不占有位置,最后父盒子高度为0,此时会影响下面的标准流盒子,清除浮动后,父级盒子会自动检测子盒子的高度。 选择器{clear:left | right | both}

方法:

3.1. 额外标签法(隔墙法)

在浮动元素的末尾添加一个空标签,例如<div style="clear:both"><div>或者(br是另类)(该标签必须是块级元素)

3.2. 父级添加overflow

给父元素添加overflow属性 overflow="hidden | auto | scroll"

3.3. :after伪元素法(父级元素添加)

.clearfix:after{content:"";display: block; hingt: 0; clear: both; visibility: hidden;}

.clearfix{*zoom:1;}IE6/7兼容

3.4. 双伪元素清除浮动(父级元素添加)

.clearfix:before,.clearfix:after {content:"";display:table;}

.clearfix:after {clear:both;}

.clearfix {*zoom:1;}

定位

1. 定位=定位模式+边偏移

定位模式:

position=static(静态定位) | relative(相对定位)| absolute(绝对定位) | fixed(固定定位)

定位模式 说明
静态定位(了解) 选择器 {position: static;} 默认定位(无定位)
相对定位 选择器 {position:relative;} 1.相对于自己原来的位置移动
2.原来的位置继续保留(不脱标)
绝对定位 选择器 {position:absolute;} 1. 相对于祖先元素来移动
2. 若没有祖先元素或祖先元素未定位,则以浏览器为准定位
3. 如果祖先元素有定位,则以最近一级的有定位的元素为参考定位
4. 绝对定位不占有原来的位置(脱标)
固定定位 选择器 {position: fixed;} 1. 以浏览器的可视窗口为参考点移动元素
跟父元素没任何关系
不随滚动条滚动
2. 不占有原先的位置
脱标
3. 固定在版心两侧位置
1)让固定位置盒子left50%
2)让固定盒子margin-left版心宽度一半距离
粘性定位(了解) 选择器 {position: sticky; top:10px} 1. 以浏览器可视窗口为参考点移动元素
2. 占有原先的位置
3. 必须添加top、left、right、bottom其中一个才有效
4. 网页中常见的效果一般通过JS来设计

边偏移:

top | bottom | left | right

如果一个盒子既有left 又有right则执行左;既有top又有bottom则执行上

2. 子绝父相

子绝,不占位置,可以在父盒子里任意地方,父亲需加定位限制,因需要占有位置,故需加相对定位

3.定位叠放次序

选择器 {z-index:1;}

1)数值越大,盒子越靠上

2)属性值相同,则按照书写顺序,后来居上

3)数字后面不能加单位

4)只有定位的盒子才有该属性

4.定位拓展

加了绝对定位的盒子不能通过margin:0 auto水平居中,相对定位可以。

绝对定位的盒子居中(垂直+水平) 1.left:50%;让盒子的左侧移动到父级元素的水平中心位置
2.margin-left:-100px;让盒子向左移动自身宽度的一半
定位的特殊性 1.行内元素添加绝对或者固定定位,可以直接设置高和宽
2. 块级元素添加绝对或者固定定位,如果不给宽高,默认是内容大小
3.浮动元素、绝对定位(固定定位)元素都不会触发外边距合并的问题
4.绝对定位(固定定位)会完全压住盒子(浮动元素只会压住下面标准流盒子,但不会压住盒子内部的文字或图片)

5.元素的显示与隐藏

语法 note
display:none | block; 1. none:隐藏对象(隐藏后不再占有原来的位置)
2. block:显示元素
visibility:visible | hidden: 1. visible:元素可见
2. hidden元素隐藏(隐藏后继续占有原来的位置)
overflow: visible | hidden | scroll | auto; 1. visible:不剪切内容也不添加滚动条
2. hidde:超出部分隐藏
3. scroll:不管超出与否,均显示滚动条
4.auto:超出显示滚动条,不超出不显示滚动条

CSS高级技巧

精灵图

目的 原理 Notes
有效的减少服务器接收和发送请求的次数,提高页面的加载速度 网页中的一些小背景图像整合到一张大图中,通过背景位置来调整位置 1. 主要针对于小的背景图片使用
2. 主要借助于背景位置来实现——background-position
3. 一般情况下都是负值

字体图标

目的 使用步骤 Notes
对工作中图标部分技术的提升和优化,减小服务器的负荷 1. 字体图标下载
2. 字体图标引入
3. 字体图标追加
1. 主要用于显示网页中通用、常用的一些小图标
2. 展示的是图标,本质属于字体,具有相同的属性,

一、下载:

http://icomoon.io & http://www.iconfont

二、引入:(以icomoon为例)

  1. 把下载包里面的fonts文件夹放入页面根目录下

  2. 在CSS样式中全局声明字体:通过CSS引入到页面中,一定注意字体文件路径问题。

    复制style.css文件中开头到font-display:blokc;}

    image-20210224005157708
  3. html标签内添加小图标(复制Demo中对应图标后面的小框)

    <span>复制过来</span>

  4. span {font-family:"icomoon";}

三、字体图标的追加

​ 把压缩包里的selection.json从新上传,选中自己想要的图标,从新下载压缩包,并替换原 来的文件——icomoon.io→icomoon app→import icons(选择selection.json)→Generate font

CSS三角做法

1
2
3
4
5
6
7
8
div {
width: 0;
height: 0;
line-height: 0;<!--兼容性,高版本可不写-->
font-size: 0;<!--兼容性,高版本可不写-->
border: 50px solid transparent;
border-left-color: pink:
}

CSS用户界面样式

属性 属性值 描述
cursor default: 小白,默认
pointer:小手
move: 移动
text: 文本
not-allowde: 禁止
更改用户鼠标样式
outline 0或者none 取消表单的轮廓线
resize none 防止拖拽文本域

溢出的文字省略号显示

1
2
3
4
(单行如下,多行了解即可,此处省略)
white-sapce: nowrap;(强制一行显示)
overfolw: hidden;(溢出隐藏)
text-overflow: ellipsis;(溢出部分省略号代替)

常见布局技巧

  1. margin负值应用

    margin:-1px;(取消盒子细线边框重叠的问题)

    鼠标经过某个盒子时显示四个边框,可以通过提高当前盒子的层级即可(如果没有定位,则加相对定位(保留位置),如果有定位,则加z-index)

  2. 文字围绕浮动元素

    文字不会环绕浮动的图片,而不会被压住。

  3. 行内块巧妙运用

    image-20210301222027830

A

acceptor 受主

active region 有源区

alignment 对准

alloy 合金

aluminum(Al) 铝

aluminum subtractive process 铝刻蚀工艺

angstrom: 埃

anion 阴离子

anisotropic etch profile 各项异性刻蚀剖面

anneal 退火

APCVD(atmospheric pressure CVD) 常压化学气相沉积

argon(Ar) 氩

arsenic(As) 砷

aspect ratio 深宽比,高宽比

atomic number 原子序数

B

back-end of line(BEOL) (生产线)后端工艺

backgrind 减薄

ball grid film(BGA) 球栅阵列

barrier reactor 组档层金属

barrier voltage 势垒电压

base 基极

batch 批

beam current 束流

beam deceleration 束流减速

beam energy 离子束能量

bipolar junction transistor(BJT) 双极晶体管

bird‘s beak effect 鸟嘴效应

bonding pads 压点

boron(B) 硼

borophosphosilicate glass(BPGS) 硼磷硅玻璃

borosilicate glass(BSG) 硼硅玻璃

bottom antireflective coating(BARC) 下减反射涂层

bubbler 带鼓泡槽

buffered oxide etch(BOE) 氧化层腐蚀缓冲液

buried layer 埋层

burn-in 老化

C

cap 掩蔽氧化层

capacitance 电容

carbon tetrafluoride(CF4) 四氟化碳

carrier 载流子

carrier-depletion region 载流子耗尽区

cation 阳离子

caustic 腐蚀性的

ceramic packaging 陶瓷封装

ceramic substrate 陶瓷基座

CERDIP 陶瓷双列直插封装

channel 沟道

channeling 沟道效应

charge carrier (带电)载流子

chemical mechanical planarization (CMP) 化学机械平坦化

chemical vapor deposition (CVD) 化学气相沉积

chip 芯片

chip scale package(CSP) 芯片尺寸封装

cleanroom 净化间

CMOS 互补金属氧化物半导体

coater 涂胶

cobalt silicide 钴硅化物

coefficient of thermal expansion (CTE) 热胀系数

collector 集电极

compound semiconductor 化合物半导体

conductor 导体

contact 接触(孔)

contamination 沾污,污染

contrast 对比度,反差

copper interconnect 铜互联

covalent bond 共价键

crystal 晶体

crystal defect 晶体缺陷

crystal growth 晶体生长

crystal lattice 晶格

crystal orientation 晶向

D

damascene 大马士革工艺

darkfield mask 暗场掩膜版

defects density 缺陷密度

defect 缺陷

degree of planarity(DP) 平整度

density 密度

depletion mode 耗尽型

deposition 淀积

development (also develop) 显影

developer 显影液

device isolation 器件隔离

DI water 去离子水

die(singular or plural) 芯片

die attach 粘片

dielectric 介质

dielectric constant(k) 介电常数

diffraction 扩散

digital/analog 数字/模拟

diluent 稀释

direct chip attach(DCA) 直接芯片沾附

discrete 分离(元器件)

dishing 凹陷

dislocation 位错

donor 施主

dopant concentration(dose) 掺杂浓度(剂量)

dopant(or impurity) 掺杂(或杂质)

doped region 掺杂区

doping 掺杂

drain 漏极

dry etch 干法刻蚀

dry oxidation 干法氧化

dry plasma etch 干法等离子体刻蚀

dual damascene process 双大马士革工艺

E

edge exclusion 无效边沿区域

electrically erasable PROM 电可擦除PROM

electrode 电极

electrode 电迁移

electroplating 电镀

emitter 发射极

endpoint detection 终点检测

enhancement mode 增强型

epi 外延

epitaxial layer 外延层

erosion 腐蚀,侵蚀

etch 刻蚀

exposure 曝光

extrinsic silicon 掺杂硅

F

fault model 失效模式

feature size 特征尺寸

FEOL (生产线)前工序

field-effect transistor(FET) 场效应晶体管

field oxide 场氧化

film 膜

first interlayer dielectric(ILD-1) 第一层层间介质

flip chip 倒装芯片

float zone 区熔法

fluorosilicate glass(FSG) 氟化玻璃

focus ion beam(FIB) 聚焦离子束

G

gallium(Ga) 镓

gallium arsenide(GaAs) 砷化镓

gate 栅极

gate oxide 栅氧化硅

germanium(Ge) 锗

grown oxide layer 热氧化法生长二氧化硅

H

heteroepitaxy 异质外延

high-temperature diffusion furnace 高温扩散炉

high vacuum 高真空

hillock 小丘,(铝)尖刺

homoepitaxy 同质外延

hot electron 热电子

hydrochloric acid(HCL) 盐酸

hydrofluoric acid(HF) 氢氟酸

hydrogen(H2) 氢气

I

IC reliability 集成电路可靠性

inert gas 惰性气体

insulator 绝缘体

integrated circuit(IC) 集成电路

interconnect 互连

intrinsic silicon 本征硅

ion 离子

ion implantation 离子注入

isolation regions 隔离区

J

JEFT 结型场效应管

junction(pn) pn结

junction spiking 结尖刺

K

killer defect 致命缺陷

L

lapping 抛光

latchup 闩锁效应

lateral diffusion 横向扩散

leadframe 引线框架

leakage current 漏电流

lithography 光刻

loaded effect 负载效应

local interconnect(LI) 局部互连

local oxidation of silicon(LOCOS) 硅局部氧化隔离法

logic 逻辑

lot 批

LPCVD 低压化学气相沉积

LSI 大规模集成电路

M

显影、曝光、清洗漏出氮化硅表面

image-20210805181953436
image-20210805182024252

刻蚀掉裸露的氮化硅然后去除光刻胶

image-20210805182232606
image-20210805182309743

放回氧化炉中氧化(二氧化硅的绝缘层(场氧化物)将于已被刻蚀的氮化物一起生长)

image-20210805182605791
image-20210805182636561
image-20210805182700490

去除剩余氮化物层

image-20210805182755050

硼离子注入晶片(通过薄的外层穿透硅衬底)

image-20210805182951001

去除被破坏的薄氧化物

image-20210805183140992

沉积多晶硅形成栅电极

image-20210805183502506

涂光刻胶并进行刻蚀

image-20210805183604135
image-20210805183632738
image-20210805183652074
image-20210805183724388
image-20210805183745519
image-20210805183817302

掺杂磷(N沟道)形成源极和漏极区

image-20210805184014089

去除光刻胶在重新上一层并进行硼掺杂(P沟道)

image-20210805184225507
image-20210805184402851
image-20210805184457992
image-20210805184520093

进入回流炉,高温使离子注入产生的缺陷被修复

沉积厚的绝缘玻璃层

image-20210805184702160

化学机械抛光

image-20210805184758921

加工二氧化硅接触孔

image-20210805185303509
image-20210805185316416

金属过孔填充(钨)并刻蚀掉多余的钨

image-20210805185429964
image-20210805185505403

沉积铝硅线,成为第一层电路布线,刻蚀布局第一层线路

image-20210805185611397
image-20210805185710914
image-20210805185726470
image-20210805185948749
image-20210805190013636

多层布线(沉积二氧化硅绝缘,布下一层线路)

image-20210805190052886
image-20210805190115959

所有金属线布局完成后,沉积氮化硅保护铝线

image-20210805190334586

刻蚀,清除顶部链接路径的氮化物

image-20210805190707160
image-20210805190741557

黄色 粉色:二氧化硅 绿色:氮化硅 红色:光刻胶 衬底绿色+蓝色:硼掺杂 黑色:多晶硅 衬底蓝色:磷 衬底黄色:硼 大理石:钨

晶体结构

晶体结构:基元在空间周期性重复排列就形成晶体结构,具有周期性和对称性。晶体结构=基元+空间点阵

image-20210716194328548

基元:组成晶体的最小结构单元,可以是单个原子或是原子基团。

阵点/格点:将基元抽象为点( 保证取同一个位置),基元的代表点。

空间点阵/布拉菲点阵:阵点/格点排列的总体(所有阵点均为严格等同体)。

空间格子/布拉菲格子:将阵点/格点用直线连接起来构成,格点构成的网格。

晶格:原子构成的网格。

简单晶格/单式晶格/布拉菲晶格:基元只包含一种原子,每个原子周围的情况完全相同,这种原子组成的网格。

复式晶格:基元包含了两个或两个以上的原子,同种原则各构成和格点相同的网络,称为子晶格,它们相对位移而成复式晶格。

image-20210717105922720

初基原胞/初基晶胞/固体物理学原胞:一个晶格最小的周期单元,体积最小的晶胞。(只包含一个格点


若以某个格点为原点O,则总可以沿三个非共面的方向找到临近的三个格点(二维为2个)A、B、C,沿此3个方向做矢量a1、a2、a3,所组成的平行六面体周期性平移可填满全部空间,初基原胞的体积为:a1.(a2.a3)


初基原胞:上述描述中的平行六面体。

基矢:上述描述中的矢量a1、a2、a3。布拉菲格子的基矢选定后,其他任一格点的位矢为:Rn=n1a1+n2a2+n3a3


初基原胞能反应晶体的周期性,但有时无法兼顾对称性,可选取体积是初基原胞整数倍的更大单元作为原胞。

晶胞/惯用原胞:上述描述中的原胞(反应周期性兼对称性的尽可能小的重复单元)。


威格纳-赛兹方法可既显示点阵的对称性,又选出最小的重复单元(一个格点的体积,初基原胞的体积),即选取一个格点为原点作原点与其他临近格点连线的中垂线(或中垂面),由这些中垂线(或中垂面)所围成的凸多面体


威格纳-赛兹原胞/W-S原胞/对称原胞:上述描述中的凸多面体。

晶格的基本类型:

  • 二维晶格(5种类型,另外一种为斜方晶格,一般的(无一下特征)晶格

    image-20210717132105638
  • 三维晶格(为方便,按照7中惯用原胞将14种晶格划分为7个晶系)

image-20210717133404650

立方晶格的特征参数

image-20210717141245180

晶系之间演变

image-20210717140946658

原子半径r:原胞中相距最近的两个原子之间距离的一半。

配位数CN:晶体中任一原子最近邻的原子数目,越大越紧密。

致密度η:晶体中原子所占总体积与晶体总体积之比。

闩锁效应

概念:闩锁效应是CMOS工艺所特有的寄生效应,是指在CMOS工艺制作的芯片中,存在寄生三极管形成的电路,在一定条件下,会导致电源与地之间产生大电流,可能会永久损坏芯片。

触发条件:电源或是地突然出现大电流脉冲,或是芯片在正常工作情况下引脚注入电流或是电压均可导致(多数发生在I/O口,也可能会在内部)。

image-20210709150204704
image-20210709104301971

版图防护:

βnβp<1则可以抑制闩锁现象。(npn和pnp寄生三极管的共射极电流增益乘积小于1就无法源源不断的进行)

  • 减小体电阻,降低触发风险
  • 加大NMOS和PMOS的隔离,加大距离(增大NPN基区宽度,使环路增益小于1)
  • ......
image-20210709112629669

电迁移

电迁移分为:

  • 热电迁移(金属化电迁移):属于物理范畴,包括:温度梯度导致的金属原子扩散和大电流导致的金属原子位移

  • 电化学迁移:包括树状金属沉积物和导电阳极丝,产生的条件因素为电场、潮湿环境、可迁移金属或化合物、污染物,银迁移为典型(所以银无法取代金,银线经过长时间通电,在结合处开始出现银空洞,结合面开始减少,最终导致脱落,产生键合失效,可以通过银合金来改善)。

电化学迁移(银迁移)

概念

在高湿度、持续性电压或具有吸水、吸附湿气特性的绝缘体等条件下,银从金属氧化变成了银离子,继而在电场的作用下,银离子从正极迁移到负极再沉积的过程(Ag>Pb≥Cu>Sn>Au)。

迁移机理

潮湿环境中水及银电离,氢离子到阴极释放氢气,氢氧根离子与银离子形成胶体沉淀,然后氢氧化银不稳定在阳极分解形成黑色氧化银沉淀,然后发生水合反应,形成银离子向阴极移动,析出,形成树枝状,从阳极向银极成扩散状。

image-20210712221931072

影响因素

  • 电压梯度(电场):发生离子迁移时,破坏时间和电场的关系基本呈直线关系,有如下经验式:tr=keE-n

  • 温度:离子迁移时,破坏时间和温度的关系基本呈直

    线关系,其经验式为:tr=kTexp(△Q/RT)

  • 湿度:湿度是环境条件中变化最大的因素

    image-20210709170228954
  • 不纯物:会因含有不纯物的组成、使用环境等的不同而产生不同的迁移形态。

image-20210709171304491
image-20210709171309725

失效图片积累

image-20210712222040324

image-20210712235319624
image-20210712235342307

热电迁移(金属化电迁移)

概念

因电子的流动所导致的金属原子移动从而产生质量的传输,导致体内某些部位产生空洞或晶须(小丘)的现象。

自扩散:在一定温度下,金属薄膜中存在一定的空位浓度,无电场情况下,金属可以在晶格内通过空位而变换位置(任一临近的原子与空穴交换位置的概率相同,所以不产生质量传输),这种金属离子的运动即是自扩散。

在外电场存在时,它有三种扩散形式:

  • 表面扩散
  • 晶格扩散
  • 晶界扩散

不同的金属所涉及的扩散形式不同,例如,焊点中的扩散主要为晶格扩散;铝互联线的扩散主要为晶界扩散;而铜互联线的扩散主要是表面扩散

在外电场作用下,金属离子受到两种力的作用:

  • 电场力:使金属离子由正极向负极移动。
  • 电子风:导电电子和金属离子间相互碰撞发生动量交换而使金属离子受到与电子流一致的作用力,金属离子由负极向正极移动(外电场作用下两者的合力为扩散的驱动力)。

对铝、金等金属薄膜,电场力很小且电流密度较大时,金属离子主要受电子风影响,结果使金属离子与电子流一样朝正极移动,在正极端形成金属离子的堆积,形成晶须,而在负极端产生空洞,使金属条断开。

产生原因

  • 内因:薄膜导体内结构的非均匀性

  • 外因:电流密度

影响因素

影响互连引线电迁移的因素十分复杂,包括工作电流聚集、焦耳热、温度梯度、晶粒结构、晶粒取向、界面组织、应力梯度、合金成分、互连尺寸及形状等(互联线的失效总是由某个严重的缺陷造成的)。

  • 铝互联线长度的影响

    image-20210713012429146
  • 铜互联线长度的影响

    image-20210713012525755
  • 厚度影响

    厚度减小,表面积比例增加,表面扩散增加,使电迁移寿命下降;

    薄的线条散热能力提高,互联线的焦耳热温升会低些,有利于电迁移寿命提高;

    厚度减小,空洞更易贯穿导线,更易引起开路,使中位寿命下降;

  • 宽度影响

    较为复杂

  • 引线几何形状

    引线的形状可以改变你电流密度的分布,引起电流聚集,产生局部的空位流增量。90°角处的密度及电流密度梯度比45°和30°时要大,后膜引线受转角形状的影响比薄膜引线大,从而电迁移现象也更为显著。

    image-20210713013430846
  • 晶粒结构

  • 温度及电流密度

    一旦互联线中形成空洞,则会导致该处的电流密度增加,电子风的作用更明显,质量运输更快,焦耳热与电流密度平方成反比,导致空洞附近温度升高,从而进一步加速空洞的生长。电流密度越大,空洞生长速度越快,一直加速到由空洞生长引起互联线的开路。

    image-20210713014258797
  • 应力梯度

    IC电路中互连引线与钝化层粘附在一起,由于互连引线的热膨胀系数远大于钝化层的热膨胀系数,因此在热加速过程中互连引线上将产生热应力和热应变,并产生相应的热应力梯度。热应力梯度的存在会降低产生空洞的应力阈值,使得空洞的形成更加容易,因而加速了电迁移进程

  • 合金元素

    在互连引线中加入合金元素的目的是增加电迁移阻力,从而提高MTF。研究表明,在Al 的引线中加入0.5%~4wt%的Cu 会提高MTF。实际上Al-Cu合金引线中的质量迁移可分为三个过程:在电迁移孕育期内,Cu溶质完全溶解;在电迁移期间,Al 发生电迁移形成空洞;在电迁移期间,空洞的稳定长大。

  • 工艺流程

失效模式

  • 短路

    电迁移产生的晶须或小丘造成互联线或相邻焊点间的短路。

    image-20210713010323690
  • 断路

    电迁移引起的互连引线或焊点的中金属原子的空洞,当金属原子的亏空到达一定程度,造成断路现象发生。

    image-20210713010420022
    image-20210713010453588
  • 参数退化

    电迁移会导致器件的稳定性,如会使漏电流增大等。

半导体基础知识

  • 本征半导体:纯净的晶体结构的半导体

  • 载流子:运载电荷的粒子

杂质半导体:

  • N型半导体:掺杂+5价原子(P磷),多子为电子

  • P型半导体:掺杂+3价原子(B硼),多子为空穴

PN结:

  • 自由电子与空穴:热激发下,价电子挣脱共价键束缚变为自由电子,留下的位置称为空穴

  • 复合运动:自由电子运动中填补空穴,二者同时消失

  • 扩散运动:物质因浓度差而产生的运动

  • 漂移运动:因电场作用所产生的运动

  • PN结的形成:参与扩散运动和飘移运动的载流子数目相同,达到动态平衡

img img

  • 正向导通:耗尽层变窄,扩散运动加剧,由于外电场,形成扩散电流,导通

  • 反向截止:耗尽层变宽,阻值扩散,利于飘移,形成飘移电流(很小),截止

img

  • PN结结电容:空间电荷区宽窄变化等效电容为势垒电容,扩散运动载流子浓度变化等效电容为扩散电容,PN结的等效电容等于二者之和

  • 箭头:半导体器件中,箭头总是从P指向N

半导体二极管

伏安特性曲线:

imgimg

  • 电流方程:img

温度影响:

  • T(℃)↑→在电流不变情况下管压降u↓ →反向饱和电流IS↑,U(BR) ↓

  • T(℃)↑→正向特性左移,反向特性下移

主要参数:

  • 最大整流电流IF:最大平均值

  • 最大反向工作电压UR:最大瞬时值

  • 反向电流IR:即IS

  • 最高工作频率fM:因PN结有电容效应

双极型晶体管(BJT)

结构特点

三级三区两PN结,发射区多子浓度高,基区多子浓度低且薄,集电区面积大

img

放大条件

发射结正偏,集电结反偏

电流分配

IE=IB+IC

  • IE:扩散运动形成
  • IB:复合运动形成
  • IC:漂移运动形成

img

输入输出特性

  • 输入特性:img

  • 输出特性:img

imgimg

工作区域

饱和区、放大区、截止区(放大状态时,输出回路iC几乎仅仅决定于iB,即可将输出回路等效为iB控制iC)

状态 uBE iC uCE
截止 <Uon ICEO VCC
放大 ≥ Uon βiB ≥ uBE
饱和 ≥ Uon <βiB ≤ uBE

温度影响

img

img

主要参数

  • 直流放大系数:img 交流放大系数:img

  • 穿透电流: img

img

结型场效应管

符号及结构示意图(N沟道)

img img

栅-源电压对导电沟道宽度的控制作用

img

漏-源电压对漏极电流的影响

img

转移特性

img

输出特性

img

绝缘栅型场效应管

img

img

img

晶闸管(可控硅SCR)

名称分类

晶闸管(可控硅,SCR, Semiconductor Controlled Rectifier),分单向和双向可控硅(三端双向可控硅,TRIAC)和 门极关断晶闸管(GTO, Gate Turn-Off Thyristor)

img

单向可控硅

img

导通条件:

  1. AK级加正向电压

  2. G极正向电压,且电流足够导通,导通后不必保持

维持状态:

  1. AK极正电压

  2. AK极间不小于维持电流

关断条件:

  1. 减小穿过AK的电流,使电流小于器件的维持电流

  2. AK极无电压或负电压

双向可控硅

img

导通条件:

  1. 坐标四象限

  2. G极正负电压,T1、T2正负电压均可导通,导通后G极不必保持电压

维持状态:

  1. T1、T2极间有电压

  2. T1、T2极间不小于维持电流

关断条件:

减小穿过T1、T2的电流,使电流小于器件的维持电流

img

gcc问题

  1. lm(libm)——链接到数学库

头文件

头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享,分为标准头文件、自定义头文件。

引用头文件的语法

使用预处理指令 #include 可以引用用户和系统头文件。它的形式有以下两种:

1
#include <file>

这种形式用于引用系统头文件。

1
#include "file"

这种形式用于引用用户头文件。

数据类型

在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。

C语言类型分类

序号 类型与描述
1 基本类型: 它们是算术类型,包括两种类型:整数类型和浮点类型。
2 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。
3 void 类型: 类型说明符 void 表明没有可用的值。
4 派生类型: 它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。

基本类型

整数类型

类型 存储大小 值范围
char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

浮点类型

类型 存储大小 值范围 精度
float 4 字节 1.2E-38 到 3.4E+38 6 位小数
double 8 字节 2.3E-308 到 1.7E+308 15 位小数
long double 16 字节 3.4E-4932 到 1.1E+4932 19 位小数

void 类型

void 类型指定没有可用的值。它通常用于以下三种情况下:

序号 类型与描述
1 函数返回为空 C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status);
2 函数参数为空 C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void);
3 指针指向 void 类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。

变量

变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。

命名规则

由字母、数字和下划线字符组成。它必须以字母或下划线开头,区分大小写。

基本变量类型

类型 描述
char 通常是一个字节(八位), 这是一个整数类型。
int 整型,4 个字节,取值范围 -2147483648 到 2147483647。
float 单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。
double 双精度浮点值。双精度是1位符号,11位指数,52位小数。
void 表示类型的缺失。

C 语言也允许定义各种其他类型的变量,比如枚举、指针、数组、结构、共用体等等变量类型

变量定义

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,多个标识符之间用逗号分隔,如下所示:

1
2
3
4
int    i, j, k;    //声明并定义了变量 i、j 和 k,编译器创建类型为 int 的名为 i、j、k 的变量。
char c, ch;
float f, salary;
double d;

变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号,后跟一个常量表达式组成,如下所示:

1
2
3
4
extern int d = 3, f = 5;    // d 和 f 的声明与初始化
int d = 3, f = 5; // 定义并初始化 d 和 f
byte z = 22; // 定义并初始化 z
char x = 'x'; // 变量 x 的值为 'x'

不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。

1
NULL = (void*)0

变量声明

变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。

变量的声明有两种情况:

  • 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
  • 2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
  • 除非有extern关键字,否则都是变量的定义。
1
2
extern int i; //声明,不是定义
int i; //声明,也是定义

运算符

运算符包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符等。

算术运算符

假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母(float型数据,分母必须加.0) B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++A 自增运算符,整数值增加 1(先+后执行) ++ A将得到 11
A++ 自增运算符,整数值增加 1(先执行后+) A++ 将得到 11
-- 自减运算符,整数值减少 1 A-- 将得到 9

关系运算符

假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
== 检查两个操作数的值是否相等,如果相等则条件为真。 (A == B) 为假。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 为假。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (A < B) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 为假。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为真。

逻辑运算符

假设变量 A 的值为 1,变量 B 的值为 0,则:

运算符 描述 实例
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 (A && B) 为假。
|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 (A || B) 为真。
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 !(A && B) 为真。

位运算符

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

赋值运算符

运算符 描述 实例
= 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A
-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C - A
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C = A 相当于 C = C A
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
|= 按位或且赋值运算符 C |= 2 等同于 C = C | 2

其他运算符

运算符 描述 实例
sizeof() 返回变量的大小。 sizeof(a) 将返回 4,其中 a 是整数。
& 返回变量的地址。 &a; 将给出变量的实际地址。
* 指向一个变量。 *a; 将指向一个变量。
? : 条件表达式 如果条件为真 ? 则值为 X : 否则值为 Y

运算符优先级

类别 运算符 结合性
后缀 () [] -> . ++ - - 从左到右
一元 + - ! ~ ++ - - (type)* & sizeof 从右到左
乘除 * / % 从左到右
加减 + - 从左到右
移位 << >> 从左到右
关系 < <= > >= 从左到右
相等 == != 从左到右
位与 AND & 从左到右
位异或 XOR ^ 从左到右
位或 OR | 从左到右
逻辑与 AND && 从左到右
逻辑或 OR || 从左到右
条件 ?: 从右到左
赋值 = += -= *= /= %=>>= <<= &= ^= |= 从右到左
逗号 , 从左到

判断

判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。

语句 描述
if语句 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if...else语句 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
嵌套if语句 您可以在一个 ifelse if 语句内使用另一个 ifelse if 语句。
switch语句 一个 switch 语句允许测试一个变量等于多个值时的情况。
嵌套switch语句 您可以在一个 switch 语句内使用另一个 switch 语句。

if语句

一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。

语法

1
2
3
4
if(条件)
{
/* 如果布尔表达式为真将执行的语句 */
}

if...else语句

一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为 false 时执行。

语法

1
2
3
4
5
6
7
8
if(条件)
{
/* 如果布尔表达式为真将执行的语句 */
}
else
{
/* 如果布尔表达式为假将执行的语句 */
}

if...else if...else语句

一个 if 语句后可跟一个可选的 else if...else 语句,这可用于测试多种条件。

  • 一个 if 后可跟零个或一个 else,else 必须在所有 else if 之后。
  • 一个 if 后可跟零个或多个 else if,else if 必须在 else 之前。
  • 一旦某个 else if 匹配成功,其他的 else if 或 else 将不会被测试。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(条件)
{
/* 当布尔表达式 1 为真时执行 */
}
else if( boolean_expression 2)
{
/* 当布尔表达式 2 为真时执行 */
}
else if( boolean_expression 3)
{
/* 当布尔表达式 3 为真时执行 */
}
else
{
/* 当上面条件都不为真时执行 */
}

嵌套if语句

可以在一个 ifelse if 语句内使用另一个 ifelse if 语句。

语法

1
2
3
4
5
6
7
8
if(条件1)
{
/* 当布尔表达式 1 为真时执行 */
if(条件2)
{
/* 当布尔表达式 2 为真时执行 */
}
}

switch语句

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。

  • switch 语句中的条件必须是一个变量。
  • 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
  • case 的 确定值必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量。
  • 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
  • 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
  • 不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
  • 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。

语法

1
2
3
4
5
6
7
8
9
10
11
12
switch(变量)
{
case 确定值1
语句1
break;/*可选的*/
case 确定值2
语句2
break;/*可选的*/
/*可以任意数量的case语句*/
default:/*可选的*/
语句3
}

嵌套switch语句

可以在一个 switch 语句内使用另一个 switch 语句

语法

1
2
3
4
5
6
7
8
9
10
11
12
switch(ch1) {
case 'A':
printf("这个 A 是外部 switch 的一部分" );
switch(ch2) {
case 'A':
printf("这个 A 是内部 switch 的一部分" );
break;
case 'B': /* 内部 B case 代码 */
}
break;
case 'B': /* 外部 B case 代码 */
}

循环

循环语句允许我们多次执行一个语句或语句组

循环类型 描述
while循环 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。
for循环 多次执行一个语句序列,简化管理循环变量的代码。
do...while循环 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。
嵌套循环 您可以在 while、for 或 do..while 循环内使用一个或多个循环。

while循环

只要给定的条件为真, while 循环语句会重复执行一个目标语句。

语法

1
2
3
4
while(条件)
{
语句;
}
  • while条件可以为任意表达式,布尔值为False时直接跳出循环。
  • 执行语句可以是单条语句,也可以是代码块。

for循环

for 循环允许编写一个执行指定次数的循环控制结构。

语法

1
2
3
4
for (初始变量; 判断条件; 循环控制变量)
{
语句;
}
  1. 初始值会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。

  2. 接下来,会判断条件。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。

  3. 在执行完 for 循环主体后,控制流会跳回上面的 循环控制变量。该语句允许更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。

  4. 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止

do...while循环

do...while 循环是在循环的尾部检查它的条件。do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环。

语法

1
2
3
4
5
do
{
statement(s);

}while( condition );
  • 条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。

  • 如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。

  • 最后while后面一定要加“;”。

嵌套循环

C 语言允许在一个循环内使用另一个循环。

嵌套 for 循环 语句的语法

1
2
3
4
5
6
7
8
9
10
for (initialization; condition; increment/decrement)
{
statement(s);
for (initialization; condition; increment/decrement)
{
statement(s);
... ... ...
}
... ... ...
}

嵌套 while 循环 语句的语法

1
2
3
4
5
6
7
8
9
10
while (condition1)
{
statement(s);
while (condition2)
{
statement(s);
... ... ...
}
... ... ...
}

嵌套 do...while 循环 语句的语法

1
2
3
4
5
6
7
8
9
10
do
{
statement(s);
do
{
statement(s);
... ... ...
}while (condition2);
... ... ...
}while (condition1);

循环控制语句

循环控制语句改变你代码的执行顺序。通过它可以实现代码的跳转。

控制语句 描述
break语句 终止循环switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。
continue语句 告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。
goto语句 将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。

break语句

  1. break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
  2. 它可用于终止 switch 语句中的一个 case。

如果使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。

continue语句

continue 会跳过当前循环中的代码,强迫开始下一次循环。

​ 1. 对于 for 循环,continue 语句执行后自增语句仍然会执行。

​ 2. 对于 whiledo...while 循环,continue 语句重新执行条件判断语句。

goto语句

允许把控制无条件转移到同一函数内的被标记的语句。在任何编程语言中,都不建议使用 goto 语句。

函数

函数是一组一起执行一个任务的语句。所有简单的程序都可以定义其他额外的函数。

定义函数

1
2
3
4
返回类型 函数名称(参数列表)
{
函数主体
}
  • 返回类型:一个函数可以返回一个值。有些函数执行所需的操作而不返回值,在这种情况下,返回类型是关键字 void
  • 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • 参数:当函数被调用时,向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体:函数主体包含一组定义函数执行任务的语句。

函数声明

return_type function_name( parameter list );

举例如下:

1
int max(int num1, int num2);

在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:

1
int max(int, int);

在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,应该在调用函数的文件顶部声明函数。

调用函数

通过调用函数来完成已定义的任务。

调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值,例如c=max(a,b);

函数参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有两种向函数传递参数的方式:

调用类型 描述
传值调用 该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用 通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

默认情况下,C 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。

传值方式调用函数

向函数传递参数的传值调用方法,把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。

默认情况下,C 语言使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数。函数 swap() 定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>

/* 函数声明 */
void swap(int x, int y);

int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;

printf("交换前,a 的值: %d\n", a );
printf("交换前,b 的值: %d\n", b );

/* 调用函数来交换值 */
swap(a, b);

printf("交换后,a 的值: %d\n", a );
printf("交换后,b 的值: %d\n", b );

return 0;
}


/* 函数定义 */
void swap(int x, int y)
{
int temp;

temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 temp 赋值给 y */

return;
}

当上面的代码被编译和执行时,它会产生下列结果:

交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 100
交换后,b 的值: 200
上面的实例表明了,虽然在函数内改变了 a 和 b 的值,但是实际上 a 和 b 的值没有发生变化。

引用方式调用函数

通过引用传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。

1
2
3
4
5
6
7
8
9
10
/* 函数定义 */
void swap(int *x, int *y)
{
int temp;
temp = *x; /* 保存地址 x 的值 */
*x = *y; /* 把 y 赋值给 x */
*y = temp; /* 把 temp 赋值给 y */

return;
}

实例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

*/\* 函数声明 \*/*
void swap(int *x, int *y);

int main ()
{
*/\* 局部变量定义 \*/*
int a = 100;
int b = 200;

printf("交换前,a 的值: %d**\n**", a );
printf("交换前,b 的值: %d**\n**", b );

*/\* 调用函数来交换值
\* &a 表示指向 a 的指针,即变量 a 的地址
\* &b 表示指向 b 的指针,即变量 b 的地址
\*/*
swap(&a, &b);

printf("交换后,a 的值: %d**\n**", a );
printf("交换后,b 的值: %d**\n**", b );

return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100

上面的实例表明了,与传值调用不同,引用调用在函数内改变了 a 和 b 的值,实际上也改变了函数外 a 和 b 的值。

数组

可以存储一个固定大小的相同类型元素的顺序集合。

申明数组

在 C 中声明一个数组,需要指定元素的类型和元素的数量,如下所示:

1
double balance[10];//一维数组申明,现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。

一个二维数组,在本质上,是一个一维数组的列表。声明一个 3 行4列的二维整型数组

1
int x[3][4];
C 中的二维数组

数组初始化

在 C 中,可以逐个初始化数组,也可以使用一个初始化语句,如下所示:

1
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};//也可忽略数组大小,等价于double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};

多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有 3 行 4 列的数组。

1
2
3
4
5
int a[3][4] = {  
{0, 1, 2, 3} , /* 初始化索引号为 0 的行 */
{4, 5, 6, 7} , /* 初始化索引号为 1 的行 */
{8, 9, 10, 11} /* 初始化索引号为 2 的行 */
};

内部嵌套的括号是可选的,下面的初始化与上面是等同的:

1
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

访问数组元素

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:

1
double salary = balance[9];

二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:

1
int val = a[2][3];

传递数组给函数

如果想要在函数中传递一个一维数组作为参数,必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,也可以传递一个多维数组作为形式参数。

方式 1

形式参数是一个指针:

1
void myFunction(int *param) { . . . }

方式 2

形式参数是一个已定义大小的数组:

1
void myFunction(int param[10]) { . . . }

方式 3

形式参数是一个未定义大小的数组:

1
void myFunction(int param[]) { . . . }

从函数返回数组

C 语言不允许返回一个完整的数组作为函数的参数。但是,可以通过指定不带索引的数组名来返回一个指向数组的指针。

如果想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:

1
int * myFunction() { . . . }

另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

实例

下面代码会生成 10 个随机数,并使用数组来返回它们,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
\#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* 要生成和返回随机数的函数 */
int * getRandom( ) {
static int r[10];
int i;
/* 设置种子 */
srand( (unsigned)time( NULL ) );
for ( i = 0; i < 10; ++i) {
r[i] = rand();
printf( "r[%d] = %d\n", i, r[i]);
}
return r;
}
/* 要调用上面定义函数的主函数 */
int main () {
/* 一个指向整数的指针 */
int *p;
int i;
p = getRandom();
for ( i = 0; i < 10; i++ ) {
printf( "*(p + %d) : %d\n", i, *(p + i));
}
return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
r[0] = 313959809
r[1] = 1759055877
r[2] = 1113101911
r[3] = 2133832223
r[4] = 2073354073
r[5] = 167288147
r[6] = 1827471542
r[7] = 834791014
r[8] = 1901409888
r[9] = 1990469526
*(p + 0) : 313959809
*(p + 1) : 1759055877
*(p + 2) : 1113101911
*(p + 3) : 2133832223
*(p + 4) : 2073354073
*(p + 5) : 167288147
*(p + 6) : 1827471542
*(p + 7) : 834791014
*(p + 8) : 1901409888
*(p + 9) : 1990469526

C 指向数组的指针

数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中:

1
double balance[50];

balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值为 balance 的第一个元素的地址:

1
2
3
4
double *p;
double balance[10];

p = balance;

使用数组名作为常量指针是合法的,反之亦然。因此,*(balance + 4) 是一种访问 balance[4] 数据的合法方式。

一旦您把第一个元素的地址存储在 p 中,您就可以使用 p、(p+1)、*(p+2) 等来访问数组元素。下面的实例演示了上面讨论到的这些概念:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
\#include <stdio.h>  
int main () {
/* 带有 5 个元素的整型数组 */
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
double *p;
int i;
p = balance;
/* 输出数组中每个元素的值 */
printf( "使用指针的数组值\n");
for ( i = 0; i < 5; i++ ) {
printf("*(p + %d) : %f\n", i, *(p + i) );
}
printf( "使用 balance 作为地址的数组值\n");
for ( i = 0; i < 5; i++ ) {
printf("*(balance + %d) : %f\n", i, *(balance + i) );
}
return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
5
6
7
8
9
10
11
12
使用指针的数组值
*(p + 0) : 1000.000000
*(p + 1) : 2.000000
*(p + 2) : 3.400000
*(p + 3) : 17.000000
*(p + 4) : 50.000000
使用 balance 作为地址的数组值
*(balance + 0) : 1000.000000
*(balance + 1) : 2.000000
*(balance + 2) : 3.400000
*(balance + 3) : 17.000000
*(balance + 4) : 50.000000

在上面的实例中,p 是一个指向 double 型的指针,这意味着它可以存储一个 double 类型的变量。一旦我们有了 p 中的地址,*p 将给出存储在 p 中相应地址的值,正如上面实例中所演示的。

字符串

在 C 语言中,字符串实际上是使用 null 字符 \0 终止的一维字符数组。

字符串的申明与初始化

下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 RUNOOB 的字符数多一个。

1
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};//C 编译器会在初始化数组时,自动把 \0 放在字符串的末尾,所以可以省略

依据数组初始化规则,可以把上面的语句写成以下语句:

1
char site[] = "RUNOOB";

操作字符串的函数:

序号 函数 & 目的
1 strcpy(s1, s2); 复制字符串 s2 到字符串 s1。
2 strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1); 返回字符串 s1 的长度。
4 strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
5 strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h> 

#include <string.h>

int main () {

char str1[14] = "runoob";

char str2[14] = "google";

char str3[14];

int len ;

/* 复制 str1 到 str3 */ *

strcpy(str3, str1);

printf("strcpy( str3, str1) : %s\n", str3 );

*/* 连接 str1 和 str2 */ *

strcat( str1, str2); *

printf("strcat( str1, str2): %s\n", str1 ); *

*/* 连接后,str1 的总长度 */

len = strlen(str1);

printf("strlen(str1) : %d\n", len ); return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
strcpy( str3, str1) :  runoob
strcat( str1, str2): runoobgoogle
strlen(str1) : 12

作用域

地址和指针

学习计划

20210528

  1. 掌握数据类型、变量、算数运算、标准头文件的使用(stdio.h、math.h)

作业

  1. printf() 来验证 a++  ++a 同理 -- 也要试验一下
  2. 输入一个华氏度转换成摄氏度,和摄氏度转华氏度
  3. 92页第8题

20210529

  1. 条件(if-else  switch-case)和循环(for  while  do-while)

作业

  1. 程序框图理解——登录验证判断
graph TB
    id0[\开始\] --> 输入名称 --> id1{判断名称是否正确} --是--> 输入密码 --> id2{判断密码是否正确} --是--> id9[\结束\]
    id1 --否--> 输入名称
    id2 --否--> 输入密码
  1. 给题1设置三次验证机会

  2. 将“温度输入转换(华氏度/摄氏度)”写成交互式代码——完成

  3. 电脑随机生成一个1~100的数,用户有5次猜数机会——完成

  4. 用户输入年份进行闰年判断(无限循环,需要用户手动终止)——完成

20210601

  1. 函数类型定义、函数返回、参数传递

作业

  1. 把“温度转换”程序写成函数,由main函数传递参数返回计算结果显示给用户
  2. 把“猜数”程序写成函数
  3. 把“登录”程序写成函数
  4. 把“闰年”程序写成函数
  5. 把以上所有参数都整理到同一个文件中,按照1~4的选择进入不同程序

20210616

  1. 学习数组的声明
  2. 数据类型的定义(数据别名)
  3. 字符串的声明
  4. 数据检查
  5. 字符串库的使用<string.h>,了解但是需要用到
  6. 数据[100] 和 数组[] 的区别
  7. 字符串的输入输出
  8. 数组的输入输出
  9. 中文在字符串中的存储空间
  10. 数组(字符串)的传递、字符串指针(较难,暂不用看)

作业

  1. 用户输入一串英文,把所有的小写字母转大写,或所有大写字母转小写
  2. 单词统计
  3. 生日管理器
  4. 平均值计算器(9门科目,用户逐一输入后,计算平均值,数值检查)