1.1 存储方式
1.2 局部变量和全局变量:
1.3 存储类型:
auto、extern、static、register
auto : 变量 栈 局
extern : 静态区(.bass和.data统称静态区),只能修饰全局变量
static : 变量静态区,局部和全局
register : 变量寄存器 ,只修饰局部变量
1.4 初始化和赋值
int a=4;//初始化
a=3;//赋值
总结:
全局变量没有初始化默认0
局部变量没有初始化默认随机值
auto:局部变量,栈区
register:局部变量,存储在寄存器中。建议将变量存储在寄存器中,提高存储速度。但是寄存器比较少,取决于编译器,没有寄存器就放在栈中。
extern:修饰全局变量,存储在静态区
vim -p extern_1.c extern_2.c 打开多个文件
gcc 1.c à./a.out(程序)
static:修饰局部变量/函数,延长生命周期只定义一次。只初始化一次
修饰全局变量,只在本文件内使用 static int a=0;
1.5 、作用域和生命周期
局部变量:
作用域:大括号
生命周期:花括号内有效
static int a=10;
作用域:大括号
生命周期: 从定义开始,到程序结束
全局变量:
生命周期:从定义开始,到程序结束
作用域;全局有效
static:修饰的全局变量
生命周期:从定义开始,到程序结束
作用域:本文件内
1.6 数据类型转换
强制类型转换:int a=10 float b; b=(float)a
瘾试类型转换:编译器自动转换
1.7 运算符
算数运算符:
+ - * / % ++ --
注意:%不能用于浮点数
++在前 ++先自加,在赋值
++在后 ++先赋值,在加
1.8 关系运算符
> < >= <= != ==
写 9=n 9==n
2.1、逻辑运算符:
0+ 1 - 0 非 1 真
&& 第一个为非就不运算了
|| 第一个为假真就不运算了
2.2、sizeof(运算符)
sizeof(数据类型) sizeof(变量名)
2.3、三目运算符
表达式1?表达式2:表达式3
成立2执行不成立3执行
2.4、逗号运算符
表达式1,表达式2;
从左到右依次计算将最后一个表达式的值赋给c
int a = 1 b = 2;
int c=(b=b+1,++b)
2.5、位运算 &、|、^、<<、>>
按位与&(有0就是0)下标从0开始
1101 0011
& 1000 0001
1000 0001
将1101 0011 的3-5位清0(清0 原位1 清0位0)
1101 0011
& 1100 0111
_____________________________
1100 0011
0-2位清0
1101 0011
& 1111 1000 数太大一般取反存储 -(0000 0111)0x 7
1101 1000
或运算|(有1就是1)
1101 0011
| 0101 1001
1101 1011
将1101 0011的0~3位变成1100
1101 0011
& 1111 0000 -0000 1111
1101 0000
|0000 1100
1101 1100
按位取反
- 1101 0011 > 0010 1100
异或
相同为0 不同为1
1101 0011
^ 1110 0110
0011 0101
左移(高位丢弃,低位补0)
原码-4左移2位 负数存储补码 补码的补码是原码
原码1000 0100
反码 1111 1011
补码 1111 1100
左移2位
1111 0000
补码 1000 1111
1001 0000
-16 <<
右移
1、无符号位(unsign)低位丢弃,高位补0
2、有符号位:(sign)
正数:低位丢弃,高位补0
负数:低位丢弃 高位补1
2.6、输入输出
函数:一个独立的功能模块
标准输入:scanf printf(对变量的数据类型没有要求)
字符的输入 getchar 输出 putchar
1、输入出
printf(“格式控制串”,输出表);
格式控制串:原样输出内容+格式化符
输出串:输出对象
%d 十进制 %o 八进制 %x/X(大写) 十六进制
#: 自动在八进制和十六进制前面添加前缀 %#o %#X
%u 无符号整数
%hd short
%ld long %lld long long
%f:float %lf:double %e :指数型 %g:选择指数和小数短的形式打印
0.001 1e-3
%.1f\n .n保留小数点后几位
f小数点6位 lf小数点8位
m指定输出的域宽,默认右对齐(左对齐-)m<原样输出数据
如果大于输出数据左边对齐
2、输入
scanf中不要添加修饰语,如果添加,输入原样
scanf(“%d\n”,&a) 5\n
2.1、如果以%d%d 输入
以空格、tab键、回车键作为输入的结束
全部输入结束,必须以回车作为结束符
2、2、如果%c%c输入 不能以空格、回车、tab键作为字符
解决办法:1、在两个字符中间加空格或, 输入的时候必须按照
字符常量
%c %c加空格 a b
%c,%c c,c
2、%*c(抑制符)
输入 空格隔开
int getchar(void)
返回值:成功返回输入的ASCII码值
输出:putchar
2. 7、控制语句
if else 、switch case 、 for、do 、while 、goto
顺序、选择、循环s
3.1switch
switch(a)
{
case 1:
c语句;
break;
case 2:
c语句;
break;
………..
defalut:printf(“”);(可以没有break)
}
当执行到结束或者break;执行结束
当1:满足没有break时就一直往下执行知道碰见break或者结束,不用判断条件就一直执行。
switch中可以有int char bool
for
for(int i = 0; i < 5; i++)
{
c语句;
}
先赋值(只赋值一次) 判断 执行c语句 i+1;
break、continue
break;直接跳出循环
continuce: 不执行后面的语句,开始下一次循环
3. 2while do while
while先判断后执行
do while 先执行后判断
3.3 goto
4、1字符串函数
loop :随便标识符
存放相同类型的数据 地址连续
定义
存储类型 数据类型 变量名
int a[5]={1,2,3} 在进行初始化的时候,未初始化的部分值为0,因此对数组中的元素清0
int a[5]={0};
int a[5]={1,2,3,4,5} int a[]={1,2,3}由后面元素的个数来决定
访问 下标0开始 a[1]
int a[5];
a[5] = {1,2,3,4,5} ;error 一个元素赋值一个集合
int a[]={0};//数组中只有一个元素,但是没有意义数组只保留一个元素没有意义
int a[5];
a = {1,2,3,4,5};//error 数组名代表的是数组首元素的地址
4、2 冒泡排序
思想:从左到右比较,如果前一个数比后一个数大交换次序否则不变,每次拿出每组中最大的一个数放在数组最后面
4、3字符数组
字符数组本质:字符串(以‘\0’作为结束符)
char str[5]={0};//最多存放4个元素,给’\0’溜一个位置
char str[6]={‘h’,’e’,’l’,’l’,’o’,’\0’};
char str[6]=“hello”;
%s 字符串的输出
puts(数组名);
功能将数组中的字符串打印到终端上,会自动添加一个换行符 puts(str)
遇到\0自动结束
gets(数组名)
功能:将键盘中的字符串保存到数组中,会自动末尾添加‘\0’
注意:gets不会注意越界检查
‘\0’ ASCII 0一样
gets和scanf的区别:
gets回车结束可以出入空格
scanf:回车、tab、空格结束 不能输入空格
数组名本身代表首元素的地址 所有不用& scanf(“%s”,str);
缓冲区:
gets:输入完成会自动清空缓冲区
scanf:输入完成之后,缓冲区会遗留空格、回车、Tab键
gets:输入之前,会查看缓冲区是否有内容,直接拿过来直接使用
scanf:标准输入函数,每一次输入都需要从键盘获得
出问题:scanf gets
puts会自动添加换行符,printf不会添加自动换行符
死循环
while(1){}
for(;1;)
赋值1 0非
5、1字符串函数
strlen 、strcpy 、strcat 、strcmp
头文件:#include<string.h>
strlen(数组名):求字符串长度
功能:求字符串的实际长度
返回值:返回字符串的实际长度不保函’\0’
sizeof和strlen的区别:
sizeof运算符 strlen是函数
sizeof求得内存空间大小,strlen字符串的实际长度(不包含’\0’)
目标数组的容量要足够大
strcpy(目标数组, 原数组);\\原数组-->目标数组
原数组的值直接覆盖
strncpy(目标数组 , 原数组,个数);//后面的数字不变
strcat(str1,str2) 将str2放在数组str1之后
strncat(str1,str2,n) n个数
strcmp(数组1/字符串1 ,数组2/字符串2);//比较2个字符串的大小
返回值:
大于0 : 字符串1 > 字符串 2
等于0 : 字符串 1 = 字符窜2
小于0 : 字符串 1 < 字符串 2
比较规则: 从左到右,比较每个字符的ASCII码值,直到遇到不同的ASCII码或者’\0’结束
strncmp(str1,str2 , n)
比较:字符串前n个字符的大小
5、2 二维数组
数据类型相同、地址连续
存储类型 数据类型 数组名[行数][列数]
部分初始化
int a[2][3] ={1,2,3};
全部初始化
int a[2][3] = {1,2,3,4,5,6};
int a[2][3] = { {0},{4,5,6}};
int a[2][]={1,2,3,4,5,6};//erro 列数不能剩
int a[][3] ={1,2,3,4,5,6}; 行数可以剩
字符数组
char str[30] = {0};
scanf(“%s”,str);
printf(“%s”,str);
char str[5][20];//定义5个数组,每个数组长度为20