一、进制之间的转换
二进制的基数是0、1
十进制是0-9
八进制是0-7,用0表示
十六进制0-9、a-f,用0x表示
二、运算符
1、算数运算符:+ - * / % ++ --
%:小数没有于数
/:整除取整
2、赋值运算:= += -= /= %= &=
1) int b = ++a;//4 ++在前,先自加再赋值
2) int b = a++;//3 ++在后,先赋值再自加
3、关系运算:> < >= <= == !=
c语言:非0为真,0为假
4、逻辑运算符
&&(逻辑与):全真则真,一假则假
||(逻辑或):一真则真,全假则假
!(逻辑非)非真即假,非假即真
截断法则:
逻辑或运算中:如果前面的表达式为真,则后面的表达式不执行
逻辑与运算中:如果前面的表达式为假,则后面的表达式不执行
5、位运算符& | ^ ~ << >>
&(位与):全1则1,有0则0
|(位或):有1则1,全0则0
^(异或):不同为1 , 相同为0
~:取反(通过补码进行操作)按位取反 0-1
6、三目运算符
判断表达式1是否成立,成立执行表达式2,在执行表达式3,循环执行表达式2,
a>b?a:b;
三、变量
1、概念:在程序运行中发生变化的量
2、定义格式:存储类型 数据类型 变量名
(auto) int a;
3、数据类型
名称 字节 取值范围(了解)
char 字符型 1字节 -2^7 ~ 2^7-1
short 短整型 2字节 -2^15 ~ 2^15 -1
int 整形 4字节 -2^31 ~ 2^31 -1
long 长整型 4字节 -2^31 ~ 2^31 -1
float 单精度浮点型 4字节 有效数据6-7位
double 双精度浮点型 8字节 有效数据15-16位
4、变量分类:
局部变量、全局变量的区别?(面试题)
局部变量 全局变量
1. 定义位置: 函数体内部 函数体外部
2. 初值: 未初始化时,值为随机值 未初始化时,值为0
3. 存储位置: 栈区 全局区
4. 生命周期: 同函数体共存亡 同整个程序共存亡
5. 作用域: 作用于函数体内部 作用于整个程序
四、常量
概念:程序运行中不会发生变化的量被称为常量
1、字符型常量
用' '括起来
'a' -> 字符a
a-> 变量'\0' ' ' '\n' '\x41' '\101' 'A‘
2、标识常量
宏定义:起标识作用,遵循标识符的命名规则一般大写表示
格式:#define 宏名 常量或表达式
特点:只能单纯替换,不要进行手动运算(原样替换,替换完再计算)
五、输入输出
1. 按字符输入输出
int getchar(void);
功能:从终端输入一个字符
参数:无
返回值:输入字符的ASCII值
int ch = getchar();//ch里面存放的是输入字符的ascii值
getchar();
1、按格式输入输出
int printf(const char *format, ...);
功能:按照指定格式向终端输出
参数:format:字符串 "hello world"
格式:
"%d" int
"%f" float
"%lf" double
"%c" char
"%s" 字符串
"%#x" 十六进制
"%#o" 八进制
"%p" 地址
"%e" 指数
"%-m.n" 含义:
.n:打印小数点后几位
m:位宽
-:左对齐,默认右对齐
2、int putchar(int c);
功能:向终端输出一个字符
参数:c:要输出字符的ASCII值
返回值:要输出字符的ASCII值
putchar(10);//putchar('\n');
putchar('a');//putchar(97);
3、垃圾字符回收
1. 通过空格回收
可以回收一个或多个的空格、回车、tab
2. %*c
只能回收任意一个字符
3. getchar()
只能回收任意一个字符,一般用于循环里面
4、强制转换
int a=5;
float b=(float)a/2;//2.500000
六、分支语句
1、基本结构
if(表达式)
{
语句块1;
}
else
{
语句块2;
}
2、分层结构
if(表达式1)
{
语句块1;
}
else if(表达式2)
{
语句块2;
}
else
{
语句块3;
}
3、嵌套结构
if(表达式1)
{
if(表达式2)
{
语句块2;
}
else
{
语句块3;
}
}
else
{
语句块1;
}
执行顺序:首先判断表达式是否成立,如果成立就执行语句块1,否则执行语句块2
总结:
- if后面可以没有else,但是else前面必须有if
- if和else后面{}可以省略,但是只能匹配之后的一条语句
4、基本结构:
switch_case
基本结构:
switch(变量或表达式)
{
case 常量1:语句块1;break;
case 常量2:语句块2;break;
case 常量3:语句块3;break;
...
case 常量n:语句块n;break;
default:语句块n+1;
}
七、循环
1、for循环
1.1、基本结构
for(表达式1;表达式2;表达式3)
{
语句块;
}
表达式1:赋初值
表达式2:循环的终止条件
表达式3:增值或减值
执行顺序:
首先执行表达式1进行赋值,然后判断表达式2是否成立,如果成立就进入循环执行语句块,再执行表达式3进行增值或减值然后继续判断表达式2是否成立,直到表达式2不成立退出循环
1.2、嵌套结构
for(表达式1;表达式2;表达式3)
{
for(表达式4;表达式5;表达式6)
{
语句块;
}
}
变形一:
int i=0;
for(;表达式2;表达式3)
{
语句块;
}
变形二:
int i=0;
for(;表达式2;)
{
语句块;
表达式3;
}
变形3:
int i=0;
for(;;)//死循环
{
if(表达式2)
{
语句块;
表达式3;
}
else
{
break;
}
}
八、函数
1. 定义:一个完成特定功能的代码模块
2. 三要素:功能、参数、返回值
3. 格式:
存储类型 数据类型 函数名(参数列表)
{
函数体;
}
1) 没有参数:参数列表可以省略,也可以用void
2) 没有返回值:数据类型为void,函数内部没有return 语句。
3) 有返回值:要根据返回值的数据类型定义函数的数据类型
4) 定义子函数时可以直接定义在主函数上面,如果定义在主函数下面需要提前声明函数
4. 函数声明:
数据类型 函数名(参数列表);//形参
5. 函数调用
(1) 没有返回值:直接调用:函数名(实参);//
(2) 有返回值:如果需要接受返回值,就要定义一个与返回值类型相同的变量接收,如果不需要接收返回值,就直接调用函数
6. 函数传参
(1) 值传递:
单向传递,将实参传递给形参使用,改变形参实参不会受影响
(2) 地址传递
双向传递,在函数中修改形参,实参会随之变化
(3)数组传递
和地址传递一样,参数中存在数组的定义,他也认为是指针
九、开辟堆区空间
1、开辟空间
#include <stdlib.h>
void *malloc(size_t size);
功能:在堆区开辟空间
参数:size:开辟空间的大小(单位:字节)
返回值:
成功:返回开辟空间的首地址
失败:NULL;
2、释放空间
#include <stdlib.h>
void free(void *ptr);
功能:释放堆区空间
参数:ptr:堆区空间首地址
返回值:无
free(p);
p=NULL;
总结:如果在子函数中开辟堆区空间,
想在主函数中拿到堆区空间首地址有两种方法:
1. 通过返回值
char * fun()
{
char *p = (char *)malloc(32);
strcpy(p, "hello");
return p;
}
int main()
{
char *m = fun();
printf("%s\n",m);
free(m);
m = NULL;
return 0;
}
2. 通过传参
void fun(char **p)//&m
{
*p = (char *)malloc(32); // m
strcpy(*p, "hello");
}
main()
{
char *m = NULL;
fun(&m);
printf("%s\n", m);
free(m);
m=NULL;
return 0;
}
十、string函数族
1. strcpy
#include <string.h>
char *strcpy(char *dest, const char *src);
功能:实现字符串复制
参数:char *dest:目标字符串首地址
const char *src:源字符串首地址
返回值:目标字符串首地址
复制包括\0
char *strncpy(char *dest, const char *src, size_t n);
功能:实现字符串复制
参数:char *dest:目标字符串首地址
const char *src:源字符串首地址
size_t n:字符的个数
返回值:目标字符串首地址
2. strlen
#include <string.h>
size_t strlen(const char *s);
功能:计算字符串的实际长度
参数:s:字符串首地址
返回值:实际长度
3. strcat
#include <string.h>
char *strcat(char *dest, const char *src);
功能:用于字符串拼接
参数:char *dest 目标字符串首地址 const char *src 源字符串首地址
返回值:目标字符串首地址
char *strncat(char *dest, const char *src, size_t n);
拼接src的前n个字符
4. strcmp
#include <string.h>
int strcmp(const char *s1, const char *s2);
功能:用于字符串比较
参数:s1 s2用于比较多字符串
返回值:
从字符串首个字符开始比较字符ASCII的大小,如果相等继续向后判断
判断大小
1 s1>s2
0 s1== s2
-1 s1<s2
int strncmp(const char *s1, const char *s2, size_t n);
比较两个字符串前n个字符的大小
5、递归函数
1. 定义:自己调用自己
2. 执行过程分为两个阶段
1) 递推阶段:从原问题出发,按递推公式从未知到已知,最终到达递归终止条件
2) 回归阶段:按递归的终止条件求出结果,逆向逐步带入递归公式,回到原问题求解