C语言介绍
什么是C语言?
1.C语言是由AT&贝尔实验室的丹尼斯·里奇于1972年发明的,那个时候所实验的电脑主要是PDP-11。
2.C语言在今天还仍然得到广泛使用的原因在于,其易于拓展到新的系统架构、高效性以及更面向于计算机底层。
C语言特性
- 较少的关键字
- 结构体、联合体等紧凑数据类型
- 支持指针或指针操作
- 外部标准库
- 最终是编译到机器码执行
- 支持宏预处理器
C语言版本
- 1972年——C语言的发明
- 1978年——C语言的第一个规范版
- 1989年——C89版(也常称为ANSI C或者标准C)
- 1990年——C90版(被ISO采纳)
- 1999年——C99标准版(有非常高的反向兼容性,但是还不被很多编译器所支持)
- 2007年——C1X新标准版
C语言用途
- 系统编程——如Linux操作系统
- 微控制器编程——汽车、飞机电子设备
- 嵌入式处理器编程——手机等移动设备
- DSP编程——数字信号处理、电视系统
C语言警告——固有的不安全性
- 无范围检查
- 编译时有限的类型安全性
- 运行时无类型检查
- 最好在调试器里运行,如gdb
- 从不要用root模式运行
编译与调试
gcc编译
# gcc -Wall infilename.c -o outfilename.o
# gcc -g -O0 -Wall infilename.c -o outfilename.o
- -Wall,使能编译器警告
- -g,使能调试信息
- -O0,让编译器进行编译时代码优化(gcc的默认优化)
- -O1,代码大小与执行时间优化
- -O2,进一步的代码大小与执行时间优化
- -O3,更进一步的代码大小与执行时间优化
gdb调试——常用命令
# gdb hello.o
- break 行号,设置断点
- break 文件:行号,在指定文件中设置断点
- run,运行程序
- c,继续执行
- next,执行下一行
- step,执行下一行或进入函数
- quit,退出gdb
- print 表达式,打印表达式的值
内存调试
valgrind ./hello.o
I/O
标准输入输出
int putchar(int),将字符进行标准输出,返回打印出的字符或者EOF错误。
int getchar(),从标准输入获取下一个字符,出现错误返回EOF。
格式化输出规范:%[标记:+或-][宽度][.精度][长度][类型]
字符串输入输出
int sprintf(char string[], char format[], arg1, arg2),将字符写进字符串数组。
int sscanf(char str[], char format[], arg1, arg2),从字符串数组获取字符。
文件I/O
int getc(FILE* fp),从文件流读取单个字符。
char[] fgets(char line[], int maxlen, FILE* fp),从文件流读取单行字符。
int putc(int c, FILE* fp),向文件流写入单个字符。
int fputs(char line[], FILE* fp),向文件流写入单行字符。
int fscanf(FILE* fp, char format[], arg1, arg2),从文件流读取格式化字符。
物理内存与虚拟内存
物理内存
定义为计算机能够用于进行数据存储和数据获取的物理资源。
- 缓存
- RAM(随机存取存储器)
- 硬盘
- 即插即用存取器
虚拟内存
由操作系统所抽象的那部分,能够被代码使用、获取的带地址的内存空间。
Windows操作系统分配了大概2GB的虚拟内存,Linux操作系统大概为3~4GB。
操作系统将虚拟内存映射到物理内存的不同部分上,其可以使用的内存部分常被成为堆栈。
栈——被声明的变量的归宿。
堆——动态内存分配的归宿。
标准库
- <stdio.h>
- <ctype.h>
- <stdlib.h>
- <assert.h>
- <stdarg.h>
- <time.h>
<stdio.h>:打开、关闭文件
FILE* fopen(const char *filename, const char *mode),以读r、写w、追加a、二值文件追加b的模式打开文件。
FILE∗ freopen(const char∗ filename, const char∗ mode, FILE∗ stream),将标准流(stdin/stdout/stderr)重定向到文件。
int fflush (FILE ∗stream),冲洗任何未写出的数据,如果stream是NULL,就会对所有输出流进行数据冲洗。
<stdio.h>:文件操作
int remove(const char ∗filename),从文件系统移除文件,成功返回0,否则返回非零值。
int rename(const char ∗oldname,const char ∗newname),文件重命名(注意文件权限以及文件存在与否)。
<stdio.h>:临时文件
FILE∗ tmpfile(void),创建一个临时文件,程序结束后被自动删除。