占位符和类型的一些技巧(C语言)

占位符:

占位符:(和字符串一样要用双引号引起来)。

是什么类型最终结果就打印什么   

%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.若一个题目中有多个类型很可能会涉及到类型强制转化(转化成啥一定要看清楚)

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值