C语言

C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。

C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。

当前最新的C语言标准为 C11 ,在它之前的C语言标准为 C99

类型运算符与表达式

变量名

变量名的开头必须是字母或下划线,不能是数字

变量名中的字母是区分大小写的

变量名绝对不可以是C语言关键字

变量名中不能有空格

数据类型及长度

类型存储大小值范围
char1字节-128到127或0到255
unsigned char1字节0到255
signed char1字节-128到127
int2或4字节-32,768到32,767或-2,147,483,648到2,147,483,647
unsigned int2或4字节0到65,535或0到4,294,967,295
short2字节-32,768到32,767
unsigned short2字节0到65,535
long4字节-2,147 ,483,648到2,147,483,647
unsigned long4字节0到4,294,967,295

常量

字符常量 常量表达式 枚举常量

声明

算术运算符

名称运算符号举例
加法运算符+2+10=12
减法运算符-10-3=7
乘法运算符*2*10=20
除法运算符/30/10=3
求余运算符(模运算符)%23%7=2
自增运算符++int a =1;a++
自减运算符--int a =1;a--

关系运算符与逻辑运算符

符号意义举例结果
>大于10>51
>=大于等于10>=101
<小于10<50
<=小于等于10<=101
==等于10==50
!=不等于10!=51
符号意义举例结果
&&逻辑与0&&10
``逻辑或
!逻辑非!01

类型转换

函数与程序结构

函数的基本知识

外部变量

作用域规则

头文件

静态变量

static int a;

寄存器变量

register int x;

register变量将放在机器的寄存器中

程序块结构

初始化

外部变量和静态变量都将被初始化为0

递归

C预处理器

指针

指针与地址

p = &c; // p为指向c的指针y = *p; // 现在y的值的c的值

指针与函数参数

void swap(int *x,int *y){    int tmp = *x;    *x = *y;    *y = tmp;}

指针与数组

数组本质也是一个指针

但是指针是一个变量,数组名不是一个变量

地址算术运算

字符串与指针

void reverse(char *s,int n){    if (n<0){        return;    }    putchar(*(s+n));    reverse(s,--n);}

指针数组以及指向指针的指针

char *sa[20];
int main(){    int x;    int *xp = &x;    int **xpp = &xp;    **xpp=15;    printf("%d",x);}

多维数组

int a[i][j];

指针数组的初始化

指针与多维数组

char *s[]={"123","321","1111"};

命令行参数

int main(int argc,char *s[]){return 0;}

指向函数的指针

int fun(int a) {  return a+6;}void fun1(int (*f)(int)) {  printf("%d \n", (*f)(48))}int main(int args, char *args[]) {  fun1(&fun);  return 0;}

复杂声明

结构

基本知识

struct{    int x;    int y;} point;struct poinit p;p.x=1;

结构与函数

结构数组

struct poinit ps[20];

结构指针

结构体中的数据对齐问题

自引用结构

struct{    int x;    int y;    struct point *p;} poinit;

表查找

类型定义

typedef char* StringString s = "123";

联合

union ut{    char a;    int b;    long c;}u;u.c=1L;

位字段

输入与输出

标准输入输出

格式化输出-printf

字符参数类型;输出形式
d,iint类型;十进制数
oint类型;无符号八进制数(没有前导0 )
x, Xint类型;无符号十六进制数(没有前导0x或0X ), 10~15分别用abcdef或ABCDEF表示
uint类型;无符号十进制数
cint类型;单个字符
schar *类型;顺序打印字符串中的字符,直到遇到'\0'或已打印了由精度指定的字符数为止
fdouble类型;十进制小数[- ] mdddddd,其中d的个数由精度指定(默认值为6 )
e, Edouble类型; [-]mdddd e +xx或[ - ]mddddd E土比,其中d的个数由精度指定(默认值为6 )
g,Gdouble类型;如果指数小于-4或大于等于精度,则用各e或8E格式输出,否则用8f格式输出。尾部的0和小数点不打印
Pvoid *类型;指针(取决于具体实现)
%不转换参数;打印一个百分号%

变长参数表

void pr(int a,...){  va_ list ap;  int i;  va_ start(ap,a);    for(i=0;i<5;i++){    printf( "%d" ,va_ arg(ap,int));  }  va_ end(ap);}int main(int argc,char *args[]){  pr(1,2,3,4,5,6);}

格式化输入-scanf

转换字符指定对输人字段的解释。对应的参数必须是指针,这也是C语言通过值调用语义所要求的

字符输人数据;参数类型
d十进制整数; int*类型
i整数; int*类型,可以是八进制(以0开头)或十六进制(以0x或0x开头)
o八进制整数(可以以0开头,也可以不以0开头) ; int *类型
u无符号十进制整数; unsigned int* 类型
x十六进制整数(可以0x或0X开头,也可以不以0x或0X开头) ; int *类型
C字符; char *类型, 将接下来的多个输人字符(默认为1个字符)存放到指定位置。该转换规范通常不跳过空白符。如果需要读人下一个非空白符,可以使用%1s

文件访问

int main(int argc,char *args[]){  FILE *fp;  FILE *fp1;  char c;  fp = fopen(" . /reverse1.c" ,"aw");  fp1 = fopen("./reverse.c","r") ;  while((c=fgetc(fp1)) != EOF){    fputc(c,fp);  }  fputs("test",fp);  fclose(fp);  fclose(fp1);}

错误处理

行输入和行输出

其他函数

UNIX系统接口

文件描述符

内核(kernel)利用文件描述符(file descriptor)来访问文件。 文件描述符是非负整数。 打开现存文件或新建文件时,内核会返回一个文件描述符。 读写文件也需要使用文件描述符来指定待读写的文件。

低级IO-read/write

open creat close unlink

随机访问-lseek