占位符:
占位符:(和字符串一样要用双引号引起来)。
是什么类型最终结果就打印什么
%s打印时遇到空格会终止打印
在%后加*号(ex: %*)这是赋值忽略符
搞清楚单个字符(%c)和浮点数的区别(%f)
只能说是%c本人用的太少了
类型也要分清楚char字符类型(%c)
Float浮点型(%f)
不同类型的打印:
一.地址的打印
%p是以16进制输出地址,而%d其实也可以输出地址但 12344是以10进制输出的,
注意:%d打印的是原码,补码先转化为原码后打印
而%p 由于其打印的是地址,因此它要打印内存里的
东西,它打印的是内存里实际存的(补码)
二.有符号整数和无符号整数
一般的打印有符号整数占位符中有“d”
而无符号整数的打印占位符中是有“u”
如右图
关于,占位符前面的东西:
1 . %3d ,是最少三位整数不足补空格 。而%03d ,是最少三位整数不足补0
2.%#o,%#x(用X输出大写字母), 这里井号的作用就可 以让八进制前缀加上0,十六进制前缀加上x
3.自定义占位符宽度:
printf(“%*.*f\n”, 6 , 2 , 0.5);
这两个(*)的值,通过printf的两个参数(6,2)
传入
关于,浮点型的”截断“:
1. 浮点型的”截断“ :
这种浮点型变浮点型的会四舍五入,但是浮点型强制转化为int
型将直接抹零。
因此:想要实现四舍五入加一个0.5即可
2 .浮点型的判断相等:
由于浮点误差,我们不能直接判断。而要近似判断
ex:
小数点位的个数要对应:上图都是4位,
记住:浮点误差是非常小的
类型:
类型:
只有int整数型才有short \long long 等修饰(因此不会产生歧义)
既可以省略ex:(long long [int]=long long)
常见类型大小(单位字节):
char == 1; (-128到127)
short int == 2 ;
int == float == 4;
double ==8;
大小使用 :
当数据过大的时候我们就可以使用更大的类型:
ex,int 类型 转变为 long 类型。
bool真假类型包含头文件 “<stdbool>”
由sizeof计算出的 Size_t是无符号整形(unsigned int)
字符串类型和单个字符的区别:
ex, “a”(字符串) != ‘a’(单个字符)
∵ ”a“ = ”a\0“(所以连引号的细节也要注意到位)
ASCII值与整数值的转化:
打印 :要打印ASCII码值还是整数关键看占位符是%c,还是%d
转换公式: 整数 + ‘0’ = 字符
结构体类型(也可以像函数一样写到外面去)(结构体非常重要)
结构体:是除char,short,int,long,等描述定义复杂对象的自定义类型
基本结构:
struct(关键字)+ 标签名
{
多种简单类型定义(如char,short,int,float,double)
这里只需要简单的声明一下,不需要初始化(字符串必须要声明为数组的形
式,不能是常量字符串)char name[ ];
这个要注意:定义float,后面的小数点要加f不然默认为double类型 ex(6.12f)
} p1{ } ; 定义变量参数;{直接写变量名即可不要写,记得加;号}
(在声明类型的同时创建变量,这里的变量就是全局变量)
( 由于中间有多个简单类型因此,要用{ }来初始化 )
在其他地方定义变量是则是局部变量
结构 : struct + 标签名 + p1 = { };
struct + 标签名代表的是结构体类型,而p1代表的是变量
(跟其他的类型一样一样的)
在结构体中要精准访问有两种方式
1.通过 (.)操作符来访问
2.通过 ->来访问
当p1是指针类型变量时
(.)没有解引用的操作要加上解引用操作符
而->不需要解引用操作符
Ex : (( struct stu* )p1)-> age = (*( struct stu* )p1). age
注意:要用箭头的话,因为箭头有解引用的作用,所以箭头的右边必须是结构体
指针类型
小结:出现结构体指针用(->),未出现结构体指针用(.)。
结构体的特殊声明:请看(283 —284)。
就是省略了标签名
注意:typedef和这个特殊声明之间的配合。
结构体类型的内存大小:(285页)
规则:第一个成员无脑放(偏移量为零),所有的成员要牵扯“对齐数”。
后面的成员要放在,偏移量为对齐数的倍数的地址处
最后,结构体总大小为最大对齐数(可能出现多个对齐数)的倍数
注意:第一个成员虽然是直接放的,但是也要算最大对齐数
对齐数:编译器默认数(一般为8)和该成员变量类型大小的较小值
修改编译器默认数:287到288
技巧 :这时对齐数 <= 8
相关知识:计算宏offsetof的使用(参考cplusplus)
为什么要浪费空间来内存对齐(以空间换时间优化查找)
写结构体的原则,就是零散的空间集中在一起(对齐的同时减少空间浪费)
结构体类型传参:
也是有传值和传址两种传法,结构体内存较大我们选择传址调用(指针变量
反正才4到8个字节大)
注意:由于传址调用会出现指针所以要配合具有解引用作用的(->)来运行
联合体类型:
结构:联合体类型的组成结构表面上看没什么区别,只是struct换成了union
打印:联合体类型的打印和结构体类型的打印非常相似
特点:联合体的特点是所有成员共同使用一块内存空间,也叫共用体
内存大小:
1.联合体至少是最大成员的大小
2.当最大成员不是最大对齐数的倍数时(这种情况一般是有数组出
现)整个联合体的大小要补成最大对齐数的整数倍
联合体能使用的场景:
1.297-298
2.由于共用的特性,它可以使用在非常绝妙的地方
枚举类型:
结构: enum (关键字)+ 标签名
{
scissors,用逗号隔开
stone,
cloth(最后一个,没逗号表示结束)
} ;
枚举常量: { }中的内容是有值的,这个值系统已经初始化(自己也可以以自己
想要的值初始化) ,这个值只能初始化在外面不能被修改
所以叫枚举常量
枚举的使用:ex : enum + 标签号 + 变量名 = scissors
enum + 标签号 = 枚举类型,上式是在给一个枚举类型的变
量赋值
打印结构体的方法:
表达式求值之整形提升
原因:c语言默认至少要整形的的精度进行运算
char类型(8个bit)short类型(16个bit)
以上两种小于32比特的(int类型)在运算时要整形提升
规则
1.对于有符号的高位补对应符号数(0,1)
2.对与无符号的高位补0;
这个好理解啊高位乱补1不是闹笑话了吗
关于截断在 Text 11—01中实操
相关知识:
只有有符号的负数 原,反,补码是都不一样的
有符号正数和无符号数 原,反,补码都一样的
那么当类型大于int时(32比特位以上)
这个时候谁大就要统一变成谁
误区:
1.字符串的地址不是一起的而是和数组的地址一样()每个都是连续的
因为字符串只能由数组实现
2.对非整形的类型不熟悉:
由于C语言没有字符串类型,字符串的使用需要依靠字符数组实现,
(只有字符型,多个字符数也就是一个字符数组就实现了一个字符串)
而且字符串数组可以不用for循环%s就可以直接输入
3.我的薄弱是非整形类型
1.若一个题目中有多个类型很可能会涉及到类型强制转化(转化成啥一定要看清楚)