关键字
存储类型
auto 自动分配空间,自动回收
register (建议)分配寄存器类型,只能32位地址,不能打印地址
static 自动初始化位0或空值,变量的值有继承性,用于修饰变量或函数,缩小作用域至函数复合语句内(内部)或该.c文件(外部)
extern 说明型 不能改变变量的值或类型,声明该变量已经在其他.c声明过了
运算符
算术运算符 + - * / % ++ --
关系运算符(逻辑值 0假1真)< <= == > >= !=
逻辑运算符 && (与) ||(或)!(非)
位运算符 << >> ~ |
条件运算符 (1/0)?A:B 1A 0B
等号扩展 X -= 1 ---> X = X-1
逗号运算符 , 一连串逗号表达式,输出最后的值
指针 * &
求字长运算符 sizeof( )
强制数据类型转换 a = (类型)b
%左右都为整形数
++ --运算符在前先运算再使用
逻辑运算符 && A&&B 先判断左若为为假直接放弃判断右侧
自带函数
输入输出专题
出入输出语句
格式化输入输出函数 scanf printf
字符输入输出函数 getchar putchar
字符串输入输出 gets() puts
输入输出控制字符
格式字符
d 十进制整数 x十六进制无符号整数 o八进制无符号整数 u十进制无符号整数
c 单一字符 s字符串
e 指数形式浮点小数 f小数形式浮点小数 g e和f中较短一位
%% 输出%本身
p 地址输出
控制字符
{0}(-)m 整体宽度输出位 左 (右) 补m位 空格 {0}
.n 设置输出小数点后位数若为字符串则为输出前n位
+ 输出若为正则输出带+号
# 输出的时候带前导符 0(8)0x(16)
l d o x u 输出精度为long型 e f g 输出精度为double型 数字后面加L 如10L 代表为 long型的10
控制流程语句
判断语句
if switch
if(判断) switch(判断)
语句; {
或 case 常量1:
if(判断) break;
语句; case 常量2:
else case 常量3:
与离它最近的if配对 break;
语句; default:
其余情况进入
}
循环语句
while do-while for if-goto 慎用
while(判断) do for(初始化;判断;执行 && ||) 标志词:
循环;(1执行) { { if(判断)
循环; 循环 ; goto 标志词;
}while(判断); } 无条件跳转不能跨函数跳转
可以一次不执行 最少执行一次 可以一次不执行 可以一次不执行
跳出循环关键字
berak continue
跳出本层循环 跳出本次循环
类型
基本类型
构造类型
数组专题
定义 (存储类型) 数据类型 标识符[下标]
(static) int a [10]
一维数组
初始化
全部初始化int a[3] = {0,1,2};
全部初始化为0 a[3] = {0};
部分初始化int a[3] = {0};
static初始化 static a[3] (直接全部为0)
起始位置
&a[0] = a
数组越界
a[i] = *(a+i)
当i超过数组范围时越界但可能不报错
二维数组
初始化
全部初始化 int a[2][3] = {1,2,3,4,5,6}; = {{1,2,3},{4,5,6}};
按行初始化 int a[][3] = {1,2,3,4,5,6};
部分初始化 int a[2][3] = {{1,2}{5,6}};
地址
int a[2][3];
int *p = a;
a = &a[0][0] = p
*(p + n) [0]= a[n][0];
字符数组
初始化
单字符初始化
char a[2] = {'a','b'};
字符串常量初始化
char a[] = "adjkfgh";
字符串结尾有\0占用一个空间
常用函数
strlen() & sizeof()
到(不含)\0结束的长度 含有\0的真正字符串长度
strcpy(目标,“操作字符串”(或地址)) & strncpy(目标,“操作字符串”(或地址),最长操作长度n)
以\0结束覆盖拷贝包括\0 最长覆盖拷贝n个字符包含\0
strcat(目标,“操作字符串”(或地址)) & strncat(目标,“操作字符串”(或地址),最长追加长度n)
去掉\0进行拷贝 去掉\0进行操作
strcmp (目标1地址,目标2地址) & strncmp(目标1地址,目标2地址,比较前n位)
比较首字母(相同比较下一位)ascll码(1-2) 比较前n位ascll码
结构体专题
结构体描述
同一时刻所有成员都能生效
定义放在主函数外
struct 结构体名
{
数据类型 成员1;
数据类型 成员2;
... ...
};
结构体引用
变量名.成员名
指针->成员名
(*指针).成员名
共用体专题
共用体描述
同一时刻只能有一个成员生效
union 共用体名
{
数据类型 成员1;
数据类型 成员2;
... ...
};
枚举专题
枚举描述
同时只能有一种状态生效
enum 枚举名
{
状态0,
状态1,
... ...
};
指针
直接访问与间接访问
直接通过地址进行访问
间接通过其他的地址存储的对应地址进行访问
空指针与野指针
空指针 int *p = NULL; 防止产生野指针,编译时报错,0号空间不分给任何空间
野指针 int *p ;
空类型
void *p;需要强行转化
指针与数组
一维数组
int a;
int *p = &a;
a[i] = *(a+i) = p[i] = *(p+i)
二维数组
取*降维
取*之后将二维降为一维数组
a[i][j] = *(*(a+i)+j);
int a[2][3];
int *p = a;
a = &a[0][0] = p
*(p + n) [0]= a[n][0];
字符数组
char *str = "china";
这时str指向的是一个字符串常量不能进行strcpy等操作
应为str = "abcde";进行改变
const与指针
常量指针
指针指向可变 值不能变
const int *p
int const *p
指针常量
指针值可变 值能变
int *const p
const int *const p 都不可变
指针数组与数组指针
指针数组
int *p[3]
p是一个数组,组内三个元素,每个元素都是一个指针
数组指针
int (*p)[3] ->(int [3] *p)
p是一个指针,指向一个数组,数组内是三个整型数据
一次移动int[3] 大小的地址
二维数组应用
int a[2][3];
int (*p)[3] = a;
则a与p完全等价
函数指针 指针函数 函数指针数组
函数指针
指向函数的指针
类型 (*指针名) (形参)
int (*p)(int)
例
#include <stdio.h>
int test(int a,char b)
{}
int main()
{
int (*p)(int,char);
int a;char b;
p = test;
p(a,b);
}
指针函数
返回指针的函数
返回值 *函数名(形参)
int *fun(int)
函数指针数组
指向函数的指针构成的数组
类型 (*数组名[下标])(形参)
int (*arr[N])(int)
例
#include <stdio.h>
int test1(int a,char b)
{}
int test2(int a,char b)
{}
int main()
{
int (*arr[2])(int,char);
int a;char b;
int c;char d;
arr[0] = test1;
arr[1] = test2;
arr[0](a,b);
arr[0](c,d);
}
疑难杂症
利用函数给指针分配空间
1.将指针的地址传入函数中,int *p; func(&p);
2.使用指针接收函数的返回值, int *p = func();
3.将指针设置成全局变量。
注意上述1.指针的地址,int *p; p的地址就是&p,那么接收这个地址的变量就必须是二级指针 int **p;
函数
函数的传参
1值传递2地址传递
格式
数据类型 函数名 (数据类型 形参名,数据类型 形参名,数据类型 形参名)
函数声明
当函数在main()下面的时候需要先将函数进行声明
如
#include <stdio.h>
void make();
int main()
{
}
void make()
{
}