ios从入门到放弃之C基础巩固-----C语言学习方式、开发环境熟悉、关键字纵览、数据类型、常量、变量&内存
在上一次https://www.cnblogs.com/webor2006/p/13375737.htmlIOS的开篇中纯扯蛋了,接下来则开启正式IOS的学习之旅,也就是开启撸码环节,而对于IOS正确的姿势应该是按这个顺序来:C--->OC--->Swift,所以学习也按正确的姿势来学习会比较踏实,那就是先从C开始学喽,其实在老早之前就学习过C:
但是!!!说实话这么多年在实际工作中用得真的不多。。所以说基本上又忘得差不多了, 所以正好可以借此机会来对C的知识体系再进行一次梳理,另外由于它是OC的基础,所以还是从C来学习是非常有必要的。
C语言学习方式:
既然曾经已经学习过C了,那学习起来就可以高效起来,也就是跳过那些自己会的,直接来学习似曾相识但又记不起来的或者是完全不知道的。另外还要有侧重点,因为这里是为了学习ios开发,对于开发ios平常对于C用得不是太多的也暂时略过,待真正用到时再学也是可以的,下面先来纵览一下整个C中的知识体系,划一下重点:
-
进制:各种进制转换、原码、反码、补码
-
数组:一维数组(
重点
)、二位数组、多维数组
为啥只重点学一维数组呢?因为在ios开发中基本上都是用OC中的数组。 -
循环:多重循环的嵌套、排序、查找(
重点
) -
函数:递归函数、递归调用
-
指针:一级指针(
重点
)、多级指针、指针和数组、函数、结构体之间的关系
对于IOS开发而言,一级指针是用得最多的,所以它是重点要学习的,其实也是指针当中也比较好理解的~~ -
内存管理:C语言的内存管理问题、内存泄露、野指针
这里为啥木有划重点呢?照理来说内存管理在C体系中是重点呀,这是因为在ios开发中有ARC机制,啥是ARC机制呢?瞅一下:
也就是有了XCODE,让我们不用太多关系内存的手动管理了,所以。。当然说它不重要也不太贴切,在面试时比较重要~~ -
有参宏及条件编译(
重点
)
这块是要好好学习学习的,这块一直学得不好~~ -
多文件开发:多文件编译、多文件开发(
重点中的重点
)
Xcode中学习C环境熟悉:
HelloWorld先整出来:
C语言的学习可以用很多的开发工具,这里不用其它的,就用Xcode,目的是为了熟悉它,目的就是为了学习ios开发做准备,话不多说,先来创建工程:
然后直接下一步创建,然后此时就可以看到有一个main.c文件:
当然里面的模板代码就是Hello World喽:
"Command + R"运行一把,看是否能正常输出,发现报错了。。
好像是账户登录有问题,由于Xcode已经好久木有使用过了,可能账号过期了,于是乎进入设置查看一下账号登录的情况:
嗯,果真是,所以重新登录再试一下:
登录成功,再运行试一把:
如何在一个工程中创建多个项目?
由于C的知识点比较多,每个知识点如果单独创建一个工程有点分散,不好集中管理,其实这里可以像Android Studio的Module一样在一个工程中创建多个项目的,先来看下在Xcode中是如何整的:
然后点击一下这个小图标,此时会是这样:
这样就两个main.c了,而运行的时候可以针对性的进行运行:
关键字纵览:
在C语言中总共有32个关键字,先有一个大致的印象,随着之后的不断操练自然而然就熟悉了,下面贴了一下:
而这32个关键字又可以细分成以下几类:
- 基本数据类型(5个):
-
-
char :字符型类型数据,属于整型数据的一种
-
int :整型数据,通常为编译器指定的机器字长
-
float :单精度浮点型数据,属于浮点数据的一种
-
double :双精度浮点型数据,属于浮点数据的一种
-
- 类型修饰关键字(4个):
-
-
long :修饰int,长整形数据,可省略被修饰的int。
-
signed :修饰整型数据,有符号数据类型
-
unsigned :修饰整型数据,无符号数据类型
-
- 复杂类型关键字(5个):
-
-
union :共用体声明
-
enum :枚举声明
-
typedef :声明类型别名
-
sizeof :得到特定类型或特定类型变量的大小
-
- 存储级别关键字(6个):
-
-
static :指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
-
register :指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形 参,建议编译器通过寄存器而不是堆栈传递参数
-
extern :指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,指示编译器 遇到此变量和函数时在其他模块中寻找其定义。
-
const :与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统 或其他线程/进程改变)
-
volatile :与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变, 强制编译器每次从内存中取得该变量的值
-
- 跳转结构(4个):
-
-
continue :结束当前循环,开始下一轮循环
-
break :跳出当前循环或switch结构
-
goto :无条件跳转语句
-
- 分支结构(5个):
-
-
else :条件语句否定分支(与if连用)
-
switch :开关语句(多重分支语句)
-
case :开关语句中的分支标记
-
default :开关语句中的“其他”分支,可选。
-
- 循环结构(3个):
-
-
do :do循环结构,do 1 while(2); 的执行顺序是1->2->1...循环,2为循环条件
-
while :while循环结构,while(1) 2; 的执行顺序是1->2->1...循环,1为循环条件 以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。
-
数据类型:
这些都比较基础,直接一带而过,就不做练习了,做个备忘。
常量:
这块也没啥好说的,列一些自认为需要记录的东东吧。
小数常量:
-
- 默认情况下编写的小数都是双精度的常量,也就是double类型,java这块也一样。
特殊字符常量:
\n 换行,相当于敲一下回车。 \t 跳到下一个tab位置,相当于按一下键盘上的tab键。 \b 退格,相当于按一下backspace。 \r 回车。 \f 换页,光标移到到下页开头。 \\ 输出\字符,也就是在屏幕上显示一个\字符。 \' 输出'字符,也就是在屏幕上显示一个'字符。 \" 输出"字符,也就是在屏幕上显示一个"字符。 \ddd 1位到3位八进制数表示的字符。 例如:使用'\376',则在屏幕上显示一个黑色的方块。 \xhh 1位到2位十六进制数表示的字符。注意x不能丢了
变量内存:
字节与地址:
表示数据最小的单位是字节,而每个字节对应着相应的内存地址,也就是内存是由字节组成的,如下图:
其中内存地址是连续的,了解一下其关系有助于理解变量的存储。
变量的存储:
-
-
所占用字节数跟类型有关,也跟编译器环境有关
-
内存由大到小寻址
-
变量存储单元的第一个字节的地址就是该变量的地址
-
任何变量在内存中都是以二进制的形式存储。一个负数的二进制形式,其实就是对它的正数的二进制形式进行取反后再+1。(取反的意思就是0变1、1变0)
-
下面来看一下不同类型的变量所占字节的位数情况:
而对于ios开发来说,只需要看64位编译器既可,因为都是64位的了。
变量的取值范围:
-
-
如果赋值的时候超出了变量的取值范围,那么将损失精度,得到“垃圾数据”(“垃圾数据”就是指并非我们想要的数据)
下面来看一下不同数据类型所表示的范围:
内存分析:
对于上面的理论下面来梳理一下对于一个变量它在内存的一个分配过程,这里定义两个变量:
按照“内存地址是由大到小来寻址”的原则,其寻址应该是这样:
而对于变量的地址其实是用其首地址,也就是:
那下面来打印一下变量的内存地址看一下: