C语言概述及流程

C语言概论

C语言简介

C语言是一门通用计算机编程语言,应用广泛,它对编写需要进行硬件操作的场合,优于其他高级语言。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言,它兼具汇编语言(执行速度快,能充分发挥硬件的潜力)和高级语言(编程/调试方便、可读性/可移植性好)的优点。尽管C语言体提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,不仅可以在电脑平台编译,还可以在一些嵌入式处理器以及超级电脑等作业平台。目前,C语言仍然具有非常强的活力。

微型计算机系统

  1. 二进制编码系统
    计算机只能识别和处理二进制码,现在,英文字母、运算符和标点符号等字符都采用ASCII码。对于多媒体计算机,把文本、图像、声音等信息按某种标准格式进行二进制编码,就可以解决文本、图像和声音等的控制管理、存储、变换和传送等。行使这些功能的系统都统称为二进制编码系统。

  2. 微型计算机硬件的基本组成
    计算机发展至今,其结构依然为冯*诺依曼结构。即由运算器、控制器、存储器、输入设备和输出设备等5部分组成。
    主机系统的基本结构图

  • 微型计算机将控制器和运算器集成为中央处理单元CPU,其输出有三种总线:地址总线(A0~A31)、数据总线(64位)和控制总线。
  • 存储器分为外存储器和内存储器(RAM和ROM)。每个存储单元为一个字节byte/B(8bits)。
  • 输入/输出接口和外部设备是人机交互的接口。
    计算机的层次结构有:裸机/操作系统/语言处理系统(核心为程序设计语言的编译系统)/通用软件、应用软件、工具软件。
    微型机系统的构成

C语言语法简述

  • 高级语言程序均由一个主程序和若干个子程序组成,C语言也不例外。函数是一个独立的程序块,相互不能嵌套函数定义。函数分为标准函数和用户自定义函数。
  • C语言的基本语言单位称为单词,分为5大类:标识符、关键字、常量、运算符和分隔符。
  • 运行一个C程序,指从建立源程序文件到执行该程序并输出正确结果的全过程。其包含编辑(建议源程序文件)、编译(翻译为二进制代码形式的目标程序)、连接(与C库函数装配成可执行的程序.exe)、运行(运行exe)。

程序和流程控制

一般程序版式

程序的编写有一定的逻辑和规范,一般情况C语言程序包含以下几个部分:

  1. 注释部分:/内容/ 或者 //内容
  2. 预处理块(#include<>等)、全局变量说明
  3. 函数定义部分:包含函数类型、函数名及参数表
  4. 变量说明部分:对变量进行定义说明
  5. 数据输入部分:对要使用的变量赋初值。可输入
  6. 执行部分:整个程序的核心,一般是对程序算法用结构化程序设计方法进行描述,然后转换为C语言语句
  7. 信息输出部分

结构化程序设计

结构化设计的基本思想是:任何程序都可以用三种基本结构表示,即顺序结构、选择结构、循环结构。这三种基本结构可进行反复嵌套。C语言为这种流程结构提供了相应的流程控制语句:

  • 选择语句:if else switch case break
  • 循环语句:for while do while 辅助词:break continue return goto

函数

结构化软件及其优越性

当开发一些比较复杂的软件时,结构化方法是常常采用的方法。结构化开发方法的基本要点是:

  1. 自顶向下:将复杂的大问题分解为相对简单的小问题,找出每个问题的关键和重点所在
  2. 逐步求精:将现实世界的问题经过几次抽象/细化处理,最后到求解域中只是一些简单的算法描述和算法实现问题。
  3. 模块化设计:逐步求精的结果是以子功能块为单位的算法描述。以子功能为单位进行程序设计时,实现其求解算法的方式称为模块化。其目的为:为了降低程序复杂性,使程序设计、调试和维护等操作简单化。

函数的定义和调用

  • 函数定义的一般格式:<存储类型> <数据函数体> 函数名 (<形式参数及说明>){ 说明语句;执行语句;}
  • 函数的存储类型说明只有extern和static,缺省表示定义的函数为外部函数。
  • 形式参数对应说明,如(int x, int y)
  • 函数的调用:调用的函数必须是应经存在的,如果调用库函数要用#include命令包含其所在文件,实参与形参必须保持一致。

C语言数据结构相关基础

数据类型、运算符和表达式

数据类型

在C语言中,数据类型可分为基本数据类型、构造数据类型、指针数据类型等。基本数据类型的最主要特点为:其值不可再分解为其他类型,即基本数据类型是自我说明的。

数据类型分类

常量

  • 整型常量
  1. 十进制:无前缀/后缀,且首字母不为0
  2. 八进制:以0为前缀,如017表示15
  3. 十六进制:以0x/0X为前缀,如0xA0表示十进制160
  4. 整型常量的后缀(后缀加l/L表示长整型,加u/U表示无符号整型常量,同时加必须保证大小写相等)。
  • 浮点型常量
  1. 十进制小数形式:由数字和小数点组成,必须有小数点。例:0.0、100. 、-3.14
  2. 指数形式(一个浮点数可以无整数部分或小数部分,但是不能二者全无。一个浮点数可以无指数或小数,但是不能二者全无 [±][整数部分][.][小数部分][(e,E)±n][后缀]
    如:.23e+12 、1. 、25E5 、+1.23e-4f
  • 字符型常量:字符型常量是用单引号括起来的一个字符。占一个字节,其值就是该字符的ASCII码值。\表示转移
  • 字符串常量:字符串常量是用双引号括起来的。字符串的最后自动加字符’\0’,表示字符串结束。
  • 符号常量:如# define 标识符 常量 例:# define PI 3.1415926

变量

在程序执行过程中,值可以改变的量称为变量。一个变量应该有一个名字,同时在内存中占据着一定的存储单元。命名规则为:

  • 必须以英文字母或者下划线开头,由字母、数字和下划线组成。
  • 不能与关键字重名,长度受限制,对大小写敏感。
    数值类型的长度和值域

运算符

C中运算符的优先级

  • 算术运算时的自动类型转换
  1. short,char -> int
  2. int -> unsigned -> long -> unsigned long -> double
  3. folat -> double -> long double
  • 强制类型转换:(类型名)表达式,例如(int)m
  • 常见问题:数据溢出,浮点变量的舍入误差,忽略变量类型进行不合法的运行等。

表达式

  1. 基本赋值表达式:左值表达式=右值表达式
  2. 复合赋值表达式: += -= *= /= %= &= |= ^= <<= >>= 左op=右 等价于 左=左op右
  3. 条件运算表达式:表达式1? 表达式2:表达式3 表达式1成立则运行表达式2,否则执行表达式3。
  4. 逗号表达式:表达式1,表达式2,……表达式n。先求表达式1的值,再求2,依次计算到n,则表达式n的值就是逗号表达式的值。

变量的存储类型

变量的数据类型决定了该变量所占内存单元的大小及形式,变量的存储类型决定了变量的存储区域,因而规定了其作用域、生存期及可见性。
对于一个正在运行的程序,其内存分为三个区域:程序代码区(程序的指令代码),静态存储区(静态存储变量存放区,包括全局变量),动态存储区(存放局部自动变量、函数的形参以及杉树调用时的小车包含和返回地址)。动态存储区包含数据区和堆栈区。
变量定义的一般形式:<存储类型> <数据类型> 变量名表

  • 自动型变量auto:在函数内或复合语句中可缺省;只能做内部变量,只在定义它的函数或符合语句中有效,}后即释放。
  • 寄存器型变量register:数据在寄存器中操作比在内存中快得多,把使用率高的少数几个变量定义为register,可以大大加快程序的运行速度。作用域和寿命同auto型。
  • 外部参照型变量extern:一般用于程序的多个编译单位之间传送数据。
  • 静态型变量static:static变量是全局寿命。全局static变量全局可见,局部static变量局部可见。
  • auto型和register型变量的内存是动态分配的,初始值是不定的,每次都要重新初始化,不一定为0。
  • static型和外部参数型变量的内存是全局存在的,分配内存后在整个程序运行完毕后才释放,其初始值为0。

数组

数组的定义及初始化

数组的定义:<存储类型> <数据类型> 数组名

  • 数组下标不允许包含变量
  • 数组名表示数据存储区域的首地址。data和&data[0]表示首地址
  • 数组作为一个整体不能参加各种运算,只有数组的元素变量可以进行数据处理
  • 数组可以进行初始化。数组最好进行初始化操作,如下:int a[3][2] = {1,2,3,4,5,6}; 或者 int a[3][2] = { {1,2,3},{4,5,6} };

数组排序

  • 选择排序法:先找出全部的最小数,再找出除了最小数之前的最小数,最后得到从小到大排序数组。
  • 冒泡排序法:比较相邻两个数据,冒泡排序,最后可得到最大的数字,最终得到从小到大排序数组。

字符数组

  • 一维字符数组:char string[20]={‘s’,’t’,’r’,’i’,’n’,’g’,’\0’};(‘\0’表示结束),string则表示”string”
  • 二维字符数组:char string[3][10]={"how","are","you?"}; string[0]表示”how”……
  • 字符串处理函数
  1. gets(字符数组) 该函数的功能是从键盘输入一个字符串到字符数组中
  2. puts(字符数组) 该函数的功能是将一个字符串输出到终端
  3. strcpy(字符数组1,字符数组2) 将字符数组2中的字符串复制到字符数组1中
  4. strcat(字符数组1,字符数组2) 把字符串2中的字符串连接到字符数组1的后面,结果放在字符数组1中
  5. strcmp(字符串1,字符串2) 把字符串1和2逐个字符进行比较(ASCII),知道出现不同的字符或遇到’\0’。相等返回0;1大于2,返回正整数;1小于2,返回负整数
  6. strlen(字符数组) 测试字符串的长度,并返回。不包含’\0’

指针

指针是C语言的一大特征。利用指针可以直接对内存中各种不同数据结构的数据进行快速处理,并且指针为函数间各类数据的传递提供了简捷便利的方法。

指针的概念

  • 计算机的内存是以字节为单位的一片连续的存储空间,每个字节都有一个编号——内存的地址。内存为地址和存放的内容。
  • 高级语言提供了通过各种名字而不是地址的方式来访问内存的方法,即系统给变量名和变量地址间建立了关系表。
  • C语言中有一种特殊性质的指针变量,其为存放地址的变量。即指针变量指向了一个地址的内存区域。
  • 在程序中,参加数据处理的量不是指针本身的量,因为指针本身是个地址量。指针的目标才是要处理的数据。

指针变量的定义和使用

  • 指针变量的定义:<存储类型> <数据类型> *指针名 (存储类型指指针的类型,数据类型指指针内容的类型)
  • 指针变量的初始化:<存储类型> <数据类型> 指针名[=初始地址值] (它不是一个运算表达式,地址值是赋给指针的)
    例:int
    pa=&a;等同于 int *pa;pa=&a;
  • void指针:定义一个指针变量,不定义指向哪种具体的数据类型,称为“无类型指针”。
  • &为取地址运算符,*为取内容运算符。
  • 使用指针的目的是用指针引用变量,所以必须使指针指向确定的目标对象。
    以下为错误:int p; p=5; 要把p指向变量等对象。

指针运算

  • 对于不同数据类型的指针p,p+n表示p+n*sizeof(p)(字节)
  • 指针p1和p2之间的数据个数:指针p1-p2 表示 (p1-p2)/sizeof(p)
  • malloc函数获取内存空间,free释放malloc函数获取的空间,成对出现。

结构和联合

结构的作用是将不同数据类型的数据组合成一个有机的整体,不仅为处理复杂的数据结构提供了手段,而且为函数间传递不同类型的数据提供了便利。

结构的定义以及结构变量的定义和使用

  • 结构的定义:struct 结构名{ 数据类型 成员名1;数据类型 成员名2;……数据类型成员名n};
  • 结构变量的定义:<存储类型> struct 结构名 结构变量名 ={初始数据};
  • 结构的使用形式:结构变量名.成员名

联合

  • 联合体在定义、说明和使用形式上与结构相似,二者本质上的不同仅在于使用内存的方式上。

    类型定义语句和枚举类型

  • C语言为编程者提供了一种新的类型名来代替已有的基本数据类型名和已经定义的类型的功能。例: typeof unsigned char BYTE;
  • C语言把一组整型符号常量按顺序集合成一种数据类型,称为枚举类型。如:enum WEEKDAY{sun,mon,tue,wedthu,fri,sat}

各种类型的数值占的内存

8bit为一个字节,32位一个字长为4字节,64位一个字长为8字节

类型 C语言 C++
bool 1
char 1 1
wchar_t 2
short 2 2/4(34/64bits)
int 2/4/4(16/32/64bits) 4
long 4/4/8(16/32/64bits) 4/8
float 4 4
double 8 8
long double 12/16(32/64bits) 16
point * 4/8(32/64bits) 4/8
{} 1 1

一般,short为半个机器厂,int为一个机器长(64位,4个字节长),long为一个或两个机器厂。

知识要点

C语言

  • C语言的优势
  • 运行一个C程序的全过程
  • 一个C语言函数的一般板式和内容
  • C语言的结构化程序设计(3个结构)
  • 函数的定义和调用
  • C中常见的数据类型及算术运算时的自动类型转换
  • 变量的存储类型和区别
  • 数组的定义、初始化和排序方法
  • 指针的概念、定义、初始化及应用
  • 结构、联合的概念区别以及定义和使用

计算机基础

  • 什么是计算思维?
  • 三大类科学方法及其对应的三大思维。
  • 图灵机及可计算性
  • 什么是算法?算法的基本要素和复杂度
  • 冯诺依曼结构
  • 计算机的系统组成(软件和硬件)及工作原理。
  • 常见的编码方式。
  • 主板、微机总线、CPU、内存、显卡、声卡等。

计算机网络及应用基础

  • 一个计算机网络一般由什么组成?
  • 数据交换分为哪两类(电路交换、分组交换)?其基本思想是什么?
  • 什么是网络协议,用处,其三个基本要素是什么?
  • 三种最常见的网络协议模型及其分层
  • 每层的具体功能以及主要内容。
  • 网络的构成要素(各层交换机、网关等)
  • 网络安全构成要素:防火墙、IDS、反病毒/个人防火墙功能
  • 物理层主要功能。编码技术、奈茥斯特定律、香农公式
  • 数据链路层实现功能。差错控制(奇偶校验、海明码、CRC)、滑动窗口、Ethernet II帧、MTU
  • 带宽(传输速率)、吞吐量(与带宽、主机CPU处理能力、网络拥堵程度等有关)

TCP/IP

  • TCP/IP的概念以及特点(开放性、实用性)
  • TCP/IP分层模型与通信实例:甲主机发给乙主机邮件“早上好”
  • IP协议三大作用模块:IP寻址、路由控制以及IP分包和组包
  • 路由算法:最短路径算法、扩散法、距离向量算法等
  • IP地址分类、掩码以及广播地址
  • IPv4首部:版本、首部长度、总长度、标识、标志、片偏移、生存时间、协议、首部校验和、源地址、目的地址等
  • DNS、ARP、ICMP、DHCP、IP隧道功能作用
  • TCP和UDP的区别和用途
  • TCP首部:源端口、目的端口、序列号、应答、数据偏移、控制位、窗口大小、校验和等
  • TCP(seq ack len)三次握手(SYN SYNACK ACK)、信息发送(ack=seq+len)、四次挥手(fin ack fin ack)
  • TCP建立连接过程、重发控制、滑动窗口协议、流量控制、慢启动、MSS
  • web的三个重要概念
  • 什么是域名、URL、网站名、服务器

HTTP协议

  • RFC2616 RFC7540
  • 有哪几种和哪几类HTTP状态信息(5类)
  • HTTP头部(通用、请求、响应、实体、其他)
  • HTTP1.0 1.1特点(无状态、请求-响应、明文传输、无法复用、队头阻塞)及相关协议下常用的优化手段(合并文件减少请求)
  • HTTP2.0特点(首部压缩、多路复用、优先级请求、服务器推送)
  • 继续100continue 101 switching protocol
  • 成功200 204no content
  • 重定向301move permanently 302move temporarily 304not modified
  • 请求错误400bad request 403forbidden 404 410
  • 服务器端错误500internal server error 503service unavailable
  • get post区别(请求主体、目的、安全性、大小限制、数据类型限制、缓存、刷新)

HTML5

  • 文档类型、模式(混杂、标准、准标准)及其设置
  • HTML中使用JavaScript的方法及有关属性(async、defer、src、type)
  • 入门 HTML5 API文档 MDN例子
  • 都有哪些标签(基本html head body h1 p br、格式b i strong、布局div、链接a href link、表单:form input(text radio checkbox) button textarea select option、表格tabel tr th td、列表ol ul li、音视频audio video source、图像img canvas等)(行内a img b td span input/行外h1 form p ul、display)
  • 新标签audio video output keygen datalist(视频、音频、画布、SVG、表单输入类型、表单元素/属性)
  • 新功能特性及实现(地理定位、localStorage、应用缓存、拖放、Web Workers Worker、服务器发送事件EventSorce)
  • 哪些属性及使用(display、事件)

CSS3

  • 入门 MDN CSS CSS官方文档
  • 盒子模型(IE6及以前的版本宽度算border、以后的IE有标准兼容模式)
  • position分为四种(static、relative、absolute、fixed left)。浮动(float:left)。
  • CSS选择器四类以及优先级(id100 class10 标签1)
  • CSS样式(text font background)(-align -left -color -size)
  • CSS新特性:边框(、阴影)、文本效果(text-shadow、text-overflow)、字体、2d3d旋转、动画(@keyframes form{} to{})、多列、过渡(transition)、用户界面
  • hack:属性hack、选择符hack、IE条件注释hack

JavaScript基础(ECMAScript)

  • JavaScript解析顺序(预编译、执行),所有的var定义变量在预编译阶段的值为undefined,而function定义在预编译阶段则为实际值。var定义的函数在定义前调用会返回语法错误。
  • 变量的类型(基本类型、引用类型)区别。数值转换(Number/parseInt/parseFloat方法、toString/String方法)。初始化及类型检测(typeof、isPrototypeOf、instanceof)
  • 变量复制、参数传递。执行环境、作用域链、变量对象;没有块级作用域
  • 垃圾收集—标记清除(进入/离开环境)、手动内存管理接触变量的引用null;
  • 引用类型实例化、方法;
  1. Object(字面量、属性/方法、通过.或者[“”]访问)
  2. Array:初始化(new 和[])、检测(instanceof Array、Array.isArray())、转换(valueOf()/toString()/join(“”))、队栈(push/pop/shift/unshift)、排序(reverse()/sort()比较字符串/sort(compare))
  3. Function:this(函数据以执行的环境对象)和arguments(有callee属性)、apply和call(设置this、扩充作用域)
  4. RegExp:元字符:[] ^ $ ?=n n{x,} 标志:g、i、m string对象的方法:match、replace等
  5. Date、Function、基本包装类型。以上为本地对象,即可使用new实例化
  6. 单体内置对象Global、Math等不可实例化。宿主为浏览器自带的document、window等
  • 创建对象模式:工厂模式、构造函数模式、原型模式、组合使用构造函数和原型模式,实现方法及其优缺点。用字面量赋值原型对象时,还需要指明constructor对象。包含引用类型的属性值统一。
  • 继承:原型链(构造函数、原型对象、实例指针)、借用构造函数(call/apply)、组合继承
  • 函数表达式:递归(混合模式下可使用arguments.callee(),var fac=(function f(num){reutrn num*f(num-1)}))、闭包(有权访问另一个函数作用域中的变量的函数)实现与避免、模仿块级作用域(function(){//块级作用域})()

BOM与DOM

  • 主流浏览器内核:IE(Trident)、火狐(Gecko)、safari(Webkit)、chrome(Blink)
  • 核心对象window,新建window.open(),window.location,navigator,navigator.plugins(插件)
  • 客户端检测:能力检测、怪癖检测、用户代理检测(navigator.userAgent)
  • 节点获取someNode.childNodes[0] nextSibling previousSibling firstChild lastChild parentChild 节点操作someNode.appendChild(new) insertBefore(new,null) replaceChild(new,old) removeChild(old)
  • 元素特性:div.getAttribute(“id”) div.setAttribute(“id”,”my”) div.removeAttribute(“id”) div.attributes[“id”]

前端综合

  • 性能优化:页面级优化(减少HTTP请求[jscss合、css sprite]、预加载、改变加载顺序、)、代码级优化(JS优化、CSS选择符、HTML、Image等),还有CDN、无cookie服务器、多域名等
  • 事件流(冒泡、捕获、DOM2事件流)、事件处理程序(HTML onclick、DOM0 btn.onclick、DOM2 btn.addEventListenter(“click”,,false)、IE btn.attachEvent(“onclick”,),跨浏览器)、获取事件(DOM event输入参数、IE window.event)、事件对象(DOM this currentTarget Target、IE srcElement)、取消冒泡(DOM stopPropagation()、IE cancelBubble)、取消事件默认事件(DOM preventDefault()、ID returnValue)、事件类型(点击/焦点/文本事件等)、事件委托
  • 实现动画(HTML5 canvas,css3 @keyframes,js 切换数据源、属性等)
  • 跨域、同源策略、JSONP、CORS、document.domain
  • cookie/localstorage/sessionstorage(同源、目的、大小、数据有效期、网络负担、安全性、作用域)

AJAX(Asynchronous Javascript And XML)

  • AJAX的实现机制(Ajax引擎、动态脚本)
  • AJAX实现方法(new open send onreadystatechange、status、responseText)
  • Ext的ajax实现方法

hexo+github博客前期实现步骤

系列教程链接

关于博客环境的搭建,网上内容很多,此处先给一个比较全面系列教材的链接(感谢博主zippera)

我在搭建中出现的问题

Gitbash使用问题

  • 在初次使用时,会发现行首有一个$符号,有这个符号时,就代表Gitbash在等待你的指令。
  • 当你输入指令后,按回车键,Gitbash开始执行命令。但是此时看起来可能没有任何反应,请耐心等待。
  • 命令执行完成后,你会再次发现$符号。如果执行有错,根据相关提示,google解决方案。
  • 有些常见问题可在这个博客里面找到解决方案:HEXO+Github,搭建属于自己的博客

注册Github账号问题

上面的教程中没有详细讲解,可以参考下面这个教程
创建GitHub技术博客全攻略
根据上面这个教程,完成到第三步(创建页面仓库)即可。如果都完成也没有问题,部署完hexo博客后,会替换成新界面的。

hexo 服务器问题

  • 本地查看过程中,请先在Gitbash中执行以下命令,安装hexo服务器
    1
    npm install hexo-server --save

部署问题

  • 在部署过程中,错误提示:Deployer not found:git时,在Gitbash中执行
    1
    npm install hexo-deployer-git --save

然后重新deploy即可

  • deploy格式

    1
    2
    3
    4
    5
    deploy:
    type: git
    repo: https://github.com/zhaopeifei/zhaopeifei.github.io.git
    branch: master
    message:
  • Gitbash可能提示你输入github账户的用户名和邮箱,根据Gitbash提示的命令格式输入。

  • 在Gitbash中输入用户名和密码后,会弹出openSSH设置,输入你的用户名和密码即可。
  • deploy完成后,会显示以下信息,此时,则上传到你的github账号的内存里面,过一小段时间,你的博客信息就会更新。
    1
    INFO Deploy done: git

主题问题

  • 在上面的系列教材中,hexo的默认主题是light。但目前(2016.2),hexo的默认主题是landscape。其yml文件内容有所不同,暂时默认,以后再进行修改即可。
  • 最开始显示的时候,你在右边栏看不到分类,tag,tagcloud这些东西,这是因为你的分类和标签里面没有任何内容,所以没有显示。只需要在你的新建的md文件上面填写tag,categories的内容就会显示了。
    1
    2
    3
    4
    5
    title: hexo+github博客前期实现步骤
    date: 2016-02-25 19:02:05
    tags: [Hexo,其他]
    categories: Hexo
    ---

markdown写法问题

  • markdown很简单,基本的书写看这个介绍即可:认识与入门 Markdown
  • markdown编写工具也有很多,网页版的就有很多(左边写markdown,右边显示结果)。我用的sublime。以后发现好的再推荐。

hexo文件夹结构

  1. source:资源文件夹是存放用户资源的地方,里面有一个_post文件夹是放你自己的post文件的地方
  2. themes:主题文件夹,hexo会根据主题来生成静态页面,里面有默认的主题landscape文件夹
  3. scaffolds:模板文件夹,新建文章时,hexo会根据其建立文件。hexo有三种默认布局:post page 和draft
  4. _config.yml:全局的配置文件。每个主题下面也有一个这个文件,属于主题的配置文件。