1.1 什么是C语言
C语言是一门通用计算机编程语言,广泛应用于底层开发。
二十世纪八十年代为避免各开发厂商用的C语言语法产生差异,由ANSI(美国国家标准局)为C语言制定了一套完整的美国国家标准语法,称为ANSIC,作为C语言最初的标准。 目前2011年,ISO(国际标准化组织)和IEC(国际电工委员会)发布的C11标准是C语言第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程 语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
1.2 第一个C语言程序
#include
int main()
{
printf("hello worldn");
return 0;
}
//解释:
//main函数是程序的入口
//一个工程中main函数有且仅有一个
1.3 数据类型
char :字符数据类型 short:短整型 int:整形 long:长整型 long long:更长的整形 float:单精度浮点数 double:双精度浮点数
存在这么多的类型,是为了更加丰富的表达生活中的各种值。
C语言没有字符串类型
1.4 变量、常量
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。
变量
变量的分类:局部变量 全局变量(当局部变量和全局变量同名的时候,局部变量优先使用)
变量的作用域:作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的 而限定这个名字的可用性的代码范围就是这个名字的作用域。
变量的生命周期:变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。
常量
C语言中的常量分为以下以下几种:
字面常量 :3.14 1000
const 修饰的常变量 :const float pai = 3.14
例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了 变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量。
#define 定义的标识符常量:#define MAX 100
枚举常量:enum Sex{MALE,FEMALE,SECRET};
1.4 字符串+转义字符+注释+标识符
字符串
由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符 串。例:"hello world!"
注:字符串的结束标志是一个 的转义字符。在计算字符串长度的时候 是结束标志,不算作字符串 内容。
转义字符
转义字符顾名思义就是转变意思。
?:在书写连续多个问号时使用,防止他们被解析成三字母词
':用于表示字符常量'
a:警告字符,蜂鸣
n:换行
r:回车
ddd:ddd表示1~3个八进制的数字。 如:printf("130"); //X (ASCLL码)
xdd:dd表示2个十六进制数字。如:printf("x30"); //0(ASCLL码)
注释
1. 代码中有不需要的代码可以直接删除,也可以注释掉
2. 代码中有些代码比较难懂,可以加一下注释文字
注释有两种风格:
C语言风格的注释 缺陷:不能嵌套注释
C++风格的注释 //xxxxxxxx 可以注释一行也可以注释多行
标识符
定义变量时,我们使用了诸如 a、abc、mn123 这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用,这叫做标识符(Identifier)。
标识符就是程序员自己起的名字,除了变量名,后面还会讲到函数名、宏名、结构体名等,它们都是标识符。不过,名字也不能随便起,要遵守规范;C语言规定,标识符只能由字母(A~Z, a~z)、数字(0~9)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。
1.6 循环语句
while语句
for语言
do...while...语言
1.7 函数
函数的特点就是简化代码,代码复用。
1.8 数组
C语言中给了数组的定义:一组相同类型元素的集合
数组的下标:C语言规定,数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
不能一次打印出数组中的所有元素,通常用遍历循环将数组中的所有元素打印出来
1.9 操作符
操作符用于数据值,操作符包括算术操作符(如加号和减号)、位操作符、关系操作符和相等操作符等。
算数操作符:+ - * / %
移位操作符:>> <<(移动二进制位)
位操作符:& ^ |
赋值操作符:= += -= *= /= &= ^= |= >>= <<=
单目操作符: ! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 --前置、后置-- ++前置、后置++ * 间接访问操作符(解引用操作符) (类型) 强制类型转换
关系操作符:> >= < <= != ==
逻辑操作符:&&逻辑与 ||逻辑或
条件操作符:exp1 ? exp2 : exp3
逗号表达式:exp1, exp2, exp3, …expN
下标引用、函数调用和结构成员:[] () . ->
1.10 常见关键字
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
关键字 typedef:typedef 顾名思义是类型定义,可理解为类型重命名
typedef unsigned int uint_32(将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名)
关键字static:在C语言中:,static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
1.11 #define 定义常量和宏
#define MAX 1000 (define定义标识符常量 )
#define ADD(x, y) ((x)+(y)) (define定义宏 )
1.12 指针
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
那地址如何存储,需要定义指针变量。指针变量是存放地址的变量。
指针变量的大小
指针变量的大小取决于地址的大小
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)
结论:指针大小在32位平台是4个字节,64位平台是8个字节。
测试32位平台:(如下图)
测试64位平台:(如下图)
1.13 结构体
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
//例如:
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
//打印结构体信息
struct Stu s = { "张三", 20, "男", "20180101" };
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %sn"), s.name, s.age, s.sex, s.id);
//->操作符
struct Stu* ps = &s;
printf("name = %s age = %d sex = %s id = %sn"), ps->name, ps->age, ps->sex, ps->id);



