常见的C程序:
基本数据类型:char(1个字节8Bit) short(2个字节) int(4个字节) long(32位4个字节64位8字节) float(4个字节)double(8个字节)enum(枚举)union(联合)struct(结构体)void(1个字节)10个
存储类型:auto (栈区) register(寄存器) static(静态区) extern(引用一个来自于外部文件(前提:同一个工程)的一个全局变量或者函数进来使用。)
控制语句:if else switch case default break continue for while do goto 11个
类型修饰符: const volatile(底层ARM的时候会看到:可以防止编译器进行优化)
其他:signed unsigned return sizeof typedef 5个
输入输出:
第一类:标准的输入输出函数: 意味着对于数据类型没有任何的限制
第二类:字符的输入输出函数: 意味着只能完成字符间的输入和输出
printf() 标准输出函数
printf(“%-m.nf”,a); m控制宽度;n控制精度;默认右对齐,加 - 表示左对齐
强制转换:范围大----->范围小 (int)f; 将f强制转换为int
隐式转换:范围小----->范围大 int +float ----->float
占位符:
整形:%d 短整型:%hd 长整型:%ld 字符型: %c
字符串:%s 单精度:%f 双精度:%lf 地址:%p
按照最短的长度打印输出: %g
输入函数:
getchar(void);从键盘获得一个字符 返回值:获得到的字符对应的ASCII值
gets:获得一个字符串,只有遇到’\n’即回车才代表输入完成,没有越界检查的功能
scanf:获得一个字符串,但是遇到空格,回车,Tab建均代表输入完成。要是想要获得一个带有空格的字符串:scanf(“%[^\n]”,数组名);
puts(数组名);
输出函数:
putchar(int c);输出一个字符到终端
puts(数组名);输出一个字符串,遇到’\0’结束标志就会停止打印,并且将’\0’会替换为’\n’进行显示在终端上。
printf:输出一个字符串,遇到’\0’停止打印,但是此时什么也不做了。
如何解决多个字符的输入赋值问题?
加逗号,加空格,还可以通过getchar()函数来获得一个字符不回显。
通过抑制符*也可以完成多个字符之间胡乱赋值的情况:字符:%*c 整形:%*d
运算符
- 算术运算符:
+ - * / % ++ --
- 逻辑运算符:
&&(与) ||(或) !(非)
0 && 1 = 0 1 || 0 = 1
截断法则:当出现1 && 2 或1 || 2时,&&:1为假时,2不执行;||:1为真时,2不执行。
- 关系运算符:
> < == !=
- 位运算符:
& | ~ ^ << >>
按位与:& &0得0;&1不变
按位或:| &1得1;&0不变
取反:~ 每一位都取相反的位
异或:^ 相同为0,不同为1
左移:<< 有符号数:正数:高位丢弃,低位补0;负数:高位丢弃,低位补0
无符号数:高位丢弃,低位补0
右移:>> 有符号数:正数:低位丢弃,高位补0;负数:低位丢弃,高位补1
无符号数:低位丢弃,高位补0
- 赋值运算符 =
- 逗号运算符:从左到右,依次执行,并将最后一个表达式的结果作为整个逗号运算符的结果。
- 三目运算符:1?2:3 1真执行2,1假执行3;2和3的值为返回值
- sizeof运算符:测试对象所占字节数的大小 sizeof(类型/变量名);
有符号数:signed char :
1000 0000 ~ 0111 1111 (-128 ~ 127)
无符号数:unsigned char:
0000 0000 ~ 1111 1111 (0 ~ 255)
局部/全局变量
局部变量:只要在{}内部的都是局部变量。从定义开始,到距离它最近的}结束。
全局变量:在{}外面定义的变量都是全局变量。从定义来开始,到源程序结束。
局部变量和全局变量重名时,如果局部变量的生命周期还未结束,则会优先使用局部变量的值。
被static修饰的局部变量:从定义开始,到程序终止。距离它最近的模块{}内有效。
被static修饰的全局变量:从定义开始,到源程序结束。只在当前文件内有效。
常量:其值在程序运行期间不可以被改变的数据
宏常量:宏是一种替换
格式: #define 宏名 值/表达式 #define N 10; #define X(m,n) m * n;(宏名建议大写)
宏是一种替换,在宏替换之前不需进行任何的运算。为了保证定义的宏绝大多数情况下符合我们的初衷,因此建议给每一个宏的参数以及宏的每一个表达式都加上括号。
循环结构
for(开始时执行1;真/假;每次循环完执行3) { }
while (真/假) {}
break;跳出循环
continue;结束本次循环
选择结构
If(真/假){} else If(真/假){} else{}
switch(整形/常量/表达式)
{
case 1:{break;}
case 2:{break;}
...
default: {break;}
}
do{ }while(真/假);
数组
内存连续、类型相同
字符数组:
1.定义格式:存储类型 数据类型 数组名[元素个数];
2.字符数组的本质:字符串
3.字符串结束标志‘\0’,没有’\0’就会造成在打印字符串的时候无限打印,直到遇到第一个’\0’截止输出。
4.给字符数组赋值
char str[20] = {‘h’,’e’,’l’,’l’,’o’}; //不建议使用
char str[20] = {“hello”}; //居多
char str[20] = “hello”;
赋值字符串时,以单引号引没有赋值’\0’就没有;但是双引号引起来会自带一个’\0’。
二维数组的类型是一个数组指针类型(int (*)[3])
指针数组
数据类型:指针数组中每一个元素所指向的数据类型。
数据类型 *:指针数组中每一个元素的数据类型
数组名:一片连续空间的名字,见名知意
strlen:获得字符串长度(遇到\0停止)
字符串的拷贝。
strcpy:将字符串2写入字符串1,返回值为1首地址
strncpy:从字符串2中拷贝指定个数字符到符串1中。参数3:个数。数返回值为1首地址。
字符串的连接。
strcat:将字符串2连接至字符串1后,返回值:连接成功之后目的字符串的地址
strncat:将字符串2前N个字符的连接至字符串1后。参数3:个数。返回值1的首地址。
字符串的比较。
先拿出str1和str2中第一个字符进行比较,不相等则立即返回*str1 - *str2(差值),若相等则需要判断是否等于’\0’,若为’\0’两个字符串相等,否则比较下一对字符,重复以上动作。
strcmp:两个字符串比较
strncmp:两个字符串中前N个的比较,参数3为N
指针
&:取址运算符(可以通过该字符获得变量在内存中的地址)
*:取值运算符(可以通过该符号获得指针所指空间的内容)
在32位下:指针占4个字节空间。在64OS下:指针占8个字节空间
二级指针:用来存储一级指针的地址
int **pp;
pp的类型:int **
pp所指向的类型:int *
pp所指向的指向类型:int
char **qq;
sizeof(qq) = 4
sizeof(*qq) = 4
sizeof(**qq) = 1
空指针:值为0的指针,只能作为初始化来使用
野指针:随机值,当查看就会段错误
段错误在C语言中出现的原因:
- 数组越界
- 访问了不该访问的空间(空指针或者野指针)
- 修改了常量区的内容
函数体
为了将功能单一的代码进行模块化编程,提高代码的复用率。
定义格式:
存储类型 返回值类型 函数名 (数据类型1 形参名1,数据类型2 形参名2........);
{
函数体;//代码的实现过程
return 返回值;
}
递归函数
自己调用自己的一种方式,但是需要注意结束的标志,如果无法结束,就会进入死递归。
枚举
作为错误码使用居多
enum 枚举名
{
常量1,
常量2,
常量N
};