WHY 为什么要回顾C语言?
iOS做的时间也不短了,差不多有了三年时间,业务需求做的越久越觉得,我们需要拓宽自己的视野。
为什么有些同学会觉得,进步哪怕一点点都很难?很多时候,我们只是被自己的认知给限制住了,在很多没有特别大价值的地方,浪费了太久的时间。
C语言,有助于我们了解底层逻辑,我们要经常复习,并且“看穿”一些高级语言的把戏,唯有机器思维才能更好的了解机器。
WHO 我们需要从哪方面着手?
基础知识,内核管理,内存管理。。。
HOW 如何熟悉?
整理一些属于自己的文档,学而时习之,温故而知新。
WHAT LET'S GO
一、一般数据类型
类型 | 占用字节 | 占用位数 |
---|---|---|
byte | 1 | 8 |
char | 1 | 8 |
boolean | 1 | 8 |
short | 2 | 16 |
int | 4 | 32 |
long | 8 | 64 |
float | 4 | 32 |
double | 8 | 64 |
注:long所占的字节数跟操作系统位数有关,32位占4个字节,64位占8个字节。
n个字节数的取值范围: ~ ,无符号位:0 ~
超出字节位数,会出现数字错乱的情况.
为什么是这样的,这涉及到原码反码补码的概念:
原码:在数值前直接加一符号位的表示法。
反码:正数即本身,负数对1求补,这里的1,本质上是一个有限位计数系统里所能表示出的最大值。
补码:正数即本身,负数对2求补,这个2指的是计数系统的容量(模)
tip:本质上来说,反码和补码都是用来处理负数的
模:二进制下,有多少位数参加运算,模就是在 1 的后面加上多少个 0。
负数的补码不存在0,10000000代表
常用到的格式化输入输出
去掉小数点后无效0 %g
保留小数点后两位 %.2f
二、运算符
与:&& 或:|| 非:!
逻辑 && 和 || 的短路情况
如果 && 左边为false,||左边为true,右边的逻辑判断会不执行
条件运算符:表达式1 ? 表达式2 : 表达式3
1为true执行2,否则执行3
sizeof():计算该数据类型所占内存空间
字符串的四个函数:
求长度函数 strlen();
拷贝函数 strcpy();
连接函数 strcat();
比较函数 strcmp();
三、结构体
C语言中构造类型包括,数组(相同数据类型的集合)和结构体(不同数据类型的集合)
一般结构体的类型为 struct+结构体名 ,所以可以用typedef为这个类取一个别名。
分配原则:自上而下分配内存空间;当上一个成员被分配的内存空间足够下一个成员使用,则下一个成员不需要分配内存;每次分配一个最大数据类型的字节空间;总字节空间为最大数据类型的整数倍。
匿名结构体:可以在结构体中声明某个联合体(或结构体)而不用指出它的名字,如此之后就可以像使用结构体成员一样直接使用其中联合体(或结构体)的成员。
四、内存地址和指针
内存中的编号就是内存地址,指针就是地址。
整形变量:用来存储整形数据的变量
指针变量(指针):存储地址的变量。
取值运算符 * ,取址运算符&
指针所占字节数只与操作系统位数有关,与指针类型无关
(指针式学习C语言的难点)
内存区的划分:
地址从小到大:代码区,常量区,静态区(全局区),堆区,栈区。
注意:OC中除了有限的几个对象之外,所有的对象全部存储在堆区。
代码区:用来存放代码的二进制文件,例如函数(main,sum)
常量区:存放常量,只可读不可被修改(1,100,'a');
指针的赋值就是指针的重指向,指向常量的指针也是可以赋值的。
静态区(全局区):静态区的变量从程序开始运行就存在,一直到程序退出才会被释放.
这里的不是说作用域,说的是生命周期。静态区的变量只会被初始化一次。static修饰的变量先于main函数执行。
(OC的#define也是放在静态区的)
堆区:唯一一个由程序员自己申请内存,自己释放内存的区域。
内存申请函数:malloc,calloc,realloc;
内存释放函数:free
栈区:申请内存的模式采用先进后出,后进先出。类似于死胡同,电梯。
栈底的地址高,栈顶的地址低。先入地址高,后入地址低。栈区的内存空间在8M左右。
五、位(比特、bit)
比特(英语:Bit),亦称二进制位,指二进制中的一位,是信息的最小单位。
Bit是Binary digit(二进制数字)的缩写。
由此可见,一个比特有2个数变化,二个比特有4个数变化,而当有N个比特有2^n个数变化。
位运算
取反(NOT):许多程序设计语言,取反操作符用波浪线"~
"表示。
值得注意的是此操作符与"逻辑非(!
)"操作符不同。逻辑非将数字整体看做一个布尔类型 "布尔 (数据类型)")--将真值转化为假,将假值转化为真;而C语言将0转化为1,将非零值转化为0。"逻辑非"并不是一个位操作。
按位或(OR):在C类程序设计语言中,按位或操作符是"|"。这一操作符需要与逻辑按位或运算符(||)区别开来。
按位异或(XOR):在类C语言中,按位异或运算符是"^"。
按位与(AND):在类C语言中,按位与用'&'表示 。
移位:在类C语言中,左移使用两个小于符号"<<"表示,右移使用两个大于符号">>"表示。
字节(Byte),通常用作计算机信息计量单位,不分数据类型。
一个字节代表八个比特。而1kb=1024byte
常用编码模式:
ASCII码:一个英文字母(不分大小写)占一个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数。换算为十进制 ,最小值-128,最大值127。如一个ASCII码就是一个字节。
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节
网友评论