基于唐老师 "C语言专题" 总结
数据类型
数据类型是创建变量的模子
类型本质
bool类型 C99
#include<
stdbool.h>
< 零表示false 1表示true >
变量本质
变量是一段实际连续存储空间的别名
程序中通过变量来申请并命名存储空间
通过变量的名字可以使用存储空间
C中32个关键字:
auto
、int、double、long、char、short、float、unsigned、signed、
sizeof
、
extern
、
static
、
goto
、
if
、
else
、struct、
typedef
、
union
、
enum
、
switch
、
case
、 break、
default
、
do
、
while
、
const
、
register
、
volatile
、return、
void
、
for
、
continue
.
define
、
include
带#是于处理指令.
定义与声明:
定义:创建对象并为其分配内存
声明:仅仅告诉编译器在程序中有这么一个对象
auto
auto即C语言中局部变量的默认属性
编译器默认所有的局部变量都是auto
static
static修饰的局部变量存储在程序的静态区
static修饰的全局变量作用域只在声明的文件中
static修饰的函数作用域只在声明的文件中
register
register关键字指明将变量存储于寄存器中
register只是
请求寄存器变量,但不一定请求成功
register只可修饰
局部变量、函数形参
不能用&运算符获取register变量的地址
if
if语句用于根据条件选择执行语句
else不能独立存在且总是与它最近的if相匹配
if语句 零值比较
1.bool型变量直接出现在条件中,不用比较
2.float型变量0值比较,需要定义精度
Tips:普通变量和0值比较,0值应该出现在变量左边. < 安全机制 >
switch
switch语句对应单个条件,多个分值
每个case语句分支必须要有
break,否则会导致分支重叠
default语句必须加上,以处理特殊情况
case语句值只能是
整型或
字符型
case语句排列顺序分析.
按字母或数字顺序排列语句.
正常情况放在前面,异常情况放在后面.
defalut语句只用于处理真正的默认情况.
do while for
循环语句基本工作方式.
通过条件表达式判定是否执行循环体.
do、while、for区别.
do语句先执行后判断,循环体至少执行一次.
while语句先判断后执行,循环体可能不执行.
for语句先判断后执行,相比while更简洁.
break 终止循环执行<do、while、for、switch>
continue 终止本次循环体,进入下次循环体<do、while、for>
do while(0) 和break的妙用
使用do while(0) 和break 可以避免造成内存泄漏 和程序简洁
高手潜规则:
禁用goto.
void
void修饰函数返回值和参数
如果函数没有返回值,那么应该将其声明为void
如果函数没有参数,应该声明其参数为void
void修饰函数返回值和参数仅表示无
不存在void变量
C语言没有定义void究竟是多大内存的别名
void指针意义
C语言规定只有相同类型的指针才可以相互赋值
void * 指针作为左值用于
接受任意类型的指针
void * 指针作为右值赋值给其他指针时需要强制类型转换
extern
声明外部定义的变量和函数
告诉编译器用C方式编译
C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通过extern关键字可以命令编译器“以标准C方式进行编译”
sizeof
sizeof是编译器的内置指示符,不是函数
sizeof用于计算
相应实体所占内存大小
sizeof的值在
编译期就已经确定
strlen
strlen是函数,在
运行时才能确定
strlen用于计算
相应实体实际长度大小
字符串计算:返回字符串所包括的字符数目,不包括结束标志的空字符
const
C中const修饰的变量是
只读的,本质还是变量
只读变量:不可以直接修改它,但可以通过指针间接修改
const修饰的变量会占用内存空间
const只对编译器有用,在运行时无用
const修饰指针
const int* p;
int const * p;
//p可变,p指向的内容不可变.
int * const p;
//p不可变,p指向的内容可变.
const int * const p;
//p和p指向的内容都不可以变.
左数右指
当const出现在*的左边时指针指向的数据不可变
当const出现在*的右边时指针本身不可变
const 修饰
函数参数和
返回值
const 修饰函数参数表示在函数体内不希望改变参数的值
const修饰函数返回值表示返回值不可改变,多用于返回指针的情形
volatile
volatile可理解为“编译器警告指示”
volatile用于告诉编译器
必须每次去内存中读取
变量值
应用:
1.并行设备的硬件寄存器
2.一个中断服务子程序中会访问到的非自动变量
3.多线程应用中被几个任务共享的变量
union
union只配置一个足够大的空间来容纳最大长度的数据成员
所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员
所有的数据成员具有相同的起始地址
union的使用受系统大小端影响
大端模式:数据的高位,保存在内存的低地址中;数据的低位,保存在内存的高地址中
小端模式:数据的高位,保存在内存的高地址中;数据的低位,保存在内存的低地址中
小同大异
enum
枚举类型,
真正的常量
enum都唯一定义一个类型,元素值不唯一
枚举成员的初始化只能通过同一枚举成员进行
enum默认常量在前一个值的基础上依次加一
enum类型的变量只能取定义时的离散值
枚举类型和#define区别
#define宏变量只是简单的进行值的替换,枚举常量是真正意义上的常量.
#define宏常量无法被调试,枚举常量可以
#define宏常量无类型信息,枚举常量是一种特定类型的常量.
typedef
typedef用于给一个已经存在的数据类型取别名
typedef并没有产生新的类型
typedef重定义的类型不能进行unsigned和signed扩展
用途
1.定义别名,用作同时声明指针型的多个对象
p1、p2都是指针
p3是指针,p4 没有定义数据类型
2.简易结构体
typedef struct _tag_POINT{
int x;
int y;
}POINT;
int x;
int y;
}POINT;
POINT *p;
3.定义与平台无关的类型,易于移植
typedef long double REAL
陷阱
typedef char* PSTR;
const PSTR 相当于 char* const, const给予了整个指针常量性
typedef在语法上是一个存储类的关键字,不可与static、extern、register同时使用
存储类关键字只能指定一个