1. 程序源代码以C语言为例,是如何转换为可执行的代码(二进制代码或者说机器语言)?
C源代码 -> 预处理器 -> 编译器 -> 汇编器 -> 链接器 -> 转换为可执行的文件
1. C源代码经过预处理器其结果,还是C语言
2. 预处理器经过编译(句法,词义分析,代码的优化,代码生成),其结果是汇编代码
3. 汇编代码结过汇编器其结果是中间代码(.o),其本质上也是二进制代码
4. 中间文件(.o)经过链接器的链接, 最后生成可执行的文件。
2.C语言里比较灵活的一块内容是指针, 那么请谈谈你对指针的理解。
回答这个问题的思路:
1、什么是指针,指针的基本概念
2.指针的使用场景
3.结合具体的例子,来说明一个, 用指针来解决那些问题。
4.关于指针运算的问题。
3.C语言内存布局
1.代码区:主要是存放代码,也就是程序指令。这个区的数据是只读
2.数据区,已初始区,声明全局变量的时候,同时给出了值, 那么这个变量就会放到已初始化。未初始化区:BSS,对于这个区的变量, 默认情况下, 全部初始为0
3.堆区:是程序员接触最多的区域。malloc函数就是从这个区来分配内存的, 这个区是从下往上扩展
4.栈区:是由系统来管理的内存区域。局部变量,函数调用也在这个区,先进后出。
5.命令参数及环境变量区
4.C语言中const 关键字的理解
a. 对于非指针变量的修饰 比int const关键字可以放到int 之前, 也可放到int之后, 如const int myInt; int const myInt;它们所表达的含义是一样的, 都是表示myInt是一个常量。 不能修改myInt的值。 我们推荐使用const int myInt;
b. 对于指针变量的声明, 有四种情况 以int * 为例
|
|
对于1、2两种情况, 所表达的含义是一样的, 表示指针指指向的内容不能修改。
对于第3种情况, 所表达的含义是说指针本身不能再指向其它地址
对于第4种情况, 表明指针指向的内容不能修改, 同时指针本身也没能再指向其它地址。
在继承语法中, 关于OC的方法调度机制
1、每一个对象,都有一个指针指向其类
2.当向对象发送消息, 对象准备执行方法的时候,它会先在当前对象对属的类中查找这个方法, 如果找到话就开始执行, 如果没有找到的话, 就去对象所属类的父类去查找, 如果找到就执行, 如果没有找到, 则会沿着继承链一层一层的向上去查找, 直到NSObject 类, 如果找到则执行, 如果没有找到, 则首先编译器会给出一个警告, 如果忽略了这个警告,则在运行时程序会崩溃。
在继承中, 子类对象是如何说父类声明的成员变量的?
在创建一个新类的时候, 其对象会首先从父类中继承成员变量, 然后添加自身的成员变量。
谈谈你对OC中self 和 super的理解?
1.self 首先他是一个指针。
2.当向对象发送消息, 对象去调用对应的方法的时候, 在调用方法中, 在这个方法里,隐藏传了一个指针, 这个指针就是self,这个self 代表的是调用这个方法的消息接收者。
3. 有时候, 我们需要在子类里显式的调用父的方法, 这个时候 super可以代表父类, 需要注意的是, 这个super不是指针,也不是成员变量, 而它只是编译器识别的指令, 主要就用于子类访问父类的内容。